shiro 授权流程

  1. subject.isPermitted("...")或subject.hasRole("..")
  2. 接着调用DelegatingSubject中的如下方法
  3.   public boolean hasRole(String roleIdentifier)
        {
            return hasPrincipals() && securityManager.hasRole(getPrincipals(), roleIdentifier);
        }
  4. securityManager 为DefaultSecurityManager
  5. 调用securityManager.hasRole或securityManager.isPermitted 其实是调用DefaultSecurityManager

    的父类

  6.  public boolean hasRole(PrincipalCollection principals, String roleIdentifier)
        {
            return authorizer.hasRole(principals, roleIdentifier);
        }
  7. 或者
         public boolean isPermitted(PrincipalCollection principals, String permissionString)
        {
            return authorizer.isPermitted(principals, permissionString);
        }

    其中authorizer = new ModularRealmAuthorizer();

  8. ModularRealmAuthorizer 中的hasRole/isPermitted的判断为
  9.  public boolean hasRole(PrincipalCollection principals, String roleIdentifier)
        {
            assertRealmsConfigured();
            for(Iterator i$ = getRealms().iterator(); i$.hasNext();)
            {
                Realm realm = (Realm)i$.next();
                if((realm instanceof Authorizer) && ((Authorizer)realm).hasRole(principals, roleIdentifier))
                    return true;
            }
    
            return false;
        }
  10.   public boolean isPermitted(PrincipalCollection principals, String permission)
        {
            assertRealmsConfigured();
            for(Iterator i$ = getRealms().iterator(); i$.hasNext();)
            {
                Realm realm = (Realm)i$.next();
                if((realm instanceof Authorizer) && ((Authorizer)realm).isPermitted(principals, permission))
                    return true;
            }
    
            return false;
        }
  11. 接着就是调用抽象类AuthorizingRealm中的hasRole/isPermitted,
  12.   public boolean hasRole(PrincipalCollection principal, String roleIdentifier)
        {
            AuthorizationInfo info = getAuthorizationInfo(principal);
            return hasRole(roleIdentifier, info);
        }
    
        protected boolean hasRole(String roleIdentifier, AuthorizationInfo info)
        {
            return info != null && info.getRoles() != null && info.getRoles().contains(roleIdentifier);
        }
  13. 或者  
      public boolean isPermitted(PrincipalCollection principals, String permission)
        {
            Permission p = getPermissionResolver().resolvePermission(permission);
            return isPermitted(principals, p);
        }
    
        public boolean isPermitted(PrincipalCollection principals, Permission permission)
        {
            AuthorizationInfo info = getAuthorizationInfo(principals);
            return isPermitted(permission, info);
        }
    
        private boolean isPermitted(Permission permission, AuthorizationInfo info)
        {
    label0:
            {
                Collection perms = getPermissions(info);
                if(perms == null || perms.isEmpty())
                    break label0;
                Iterator i$ = perms.iterator();
                Permission perm;
                do
                {
                    if(!i$.hasNext())
                        break label0;
                    perm = (Permission)i$.next();
                } while(!perm.implies(permission));
                return true;
            }
            return false;
        }
  14. 其中getAuthorizationInfo中通过方法doGetAuthorizationInfo获取已存在的授权信息
  15. doGetAuthorizationInfo通过子类实现具体的内容
时间: 2025-01-19 09:12:01

shiro 授权流程的相关文章

shiro框架学习-2-springboot整合shiro及Shiro认证授权流程

1. 添加依赖 1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-web</artifactId> 4 </dependency> 5 <dependency> 6 <groupId>mysql</groupId> 7 <artifactId>mys

JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

shiro介绍 什么是shiro shiro是Apache的一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架.它可以实现如下的功能: 1.验证用户 2.对用户执行访问控制,如:判断用户是否具有角色admin,判断用户是否拥有访问的资源权限. 3.在任何环境下使用SessionAPI.例如C/S程序 4.可以使用多个用户数据源.例如一个是Oracle数据库,另外一个是MySQL数据库. 5.单点登录(SSO)功能

shiro基础学习(三)&mdash;shiro授权

一.入门程序 1.授权流程        2.授权的三种方式 (1)编程式: 通过写if/else 授权代码块完成. Subject subject = SecurityUtils.getSubject(); if(subject.hasRole("admin")) {      //有权限 } else {      //无权限 } (2)注解式: 通过在执行的Java方法上放置相应的注解完成. @RequiresRoles("admin") public voi

shiro授权及自定义realm授权(七)

1.授权流程 2.    三种授权方法 Shiro 支持三种方式的授权: 编程式:通过写if/else 授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(subject.hasRole("admin")) { //有权限 } else { //无权限 } 注解式:通过在执行的Java方法上放置相应的注解完成: @RequiresRoles("admin") public void hello() {

Spring中集成Shiro授权实例

授权流程回顾 首先说一句,使用授权的前提当然是先要实现身份验证,也就是要保证用户登录之后才可能考虑授权的问题.关于身份验证之前已经写过了,还不清楚的童鞋可以点这里 上一篇文章介绍了Shiro中授权的一些基础知识和原理.学了就要用,本篇文章就介绍如何在项目中应用Shiro的授权.这里为了方便大家阅读,先贴出上一篇文章中分析出的授权流程: 当我们调用Subject.hasRole(...)后 首先会委托给securityManager来处理,而securityManager内部有一个Authoriz

Shiro授权管理

一.授权 授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等).在授权中需了解的几个关键对象:主体(Subject).资源(Resource).权限(Permission).角色(Role). 二.Shiro授权概念(RBAC) 1,Subject 主体,即访问应用的用户,在Shiro中使用Subject代表该用户.用户只有授权后才允许访问相应的资源. 2,Resource 在应用中用户可以访问的任何东西,比如访问JSP 页面.查看/编辑某些数据.访问某个业务方

第三章:shiro授权认证

授权:也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等). 主体:即访问应用的用户,在Shiro中使用Subject代表该用户.用户只有授权后才允许访问相应的资源. 资源:在应用中用户可以访问的 URL,比如访问 JSP 页面.查看/编辑某些数据.访问某个业务方法.打印文本等等都是资源.用户只要授权后才能访问. 权限:安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力.即权限表示在应用中用户能不能访问某个资源. 角色:代表了操作集合,

微信第三方平台一键授权流程设计指引

1.对新用户,适时引导进入登录授权页 由于公众号登录授权只需运营者一键操作即可授权,比以往需运营者进行复杂参数配置的方式要简单得多,因此在产品设计过程中,第三方平台应当: 1)避免让运营者理解复杂配置,直接让其进入最简单.最直观的一键登录授权页,这样可以确保第三方平台的注册转化率高. 2)将授权流程(其实是绑定公众号的流程)作为第三方平台的帐号注册中的步骤,因为绑定公众号后,第三方平台账号才可正常运作,进行公众号运营. 2.对老用户,提醒其补充授权 第三方平台的老用户,是指在第三方平台接入公众号

Apache Shiro 使用手册(三)Shiro 授权

授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等. 一.授权的三要素 授权有着三个核心元素:权限.角色和用户. 权限 权限是Apache Shiro安全机制最核心的元素.它在应用程序中明确声明了被允许的行为和表现.一个格式良好的权限声明可以清晰表达出用户对该资源拥有的权限. 大多数的资源会支持典型的CRUD操作(create.read.update.delete),但是任何操作