• ​Shiro授权


    Shiro三种授权方式

    编程式:通过写 if/else 授权代码块完成:

    Subject subject = SecurityUtils.getSubject();
    if(subject.hasRole(“admin”)) {
        //有权限
    } else {
        //无权限
    }

    注解式:通过在执行的 Java 方法上放置相应的注解完成:

    @RequiresRoles("admin")
    public void hello() {
        //有权限
    }

    没有权限将抛出相应的异常;

    JSP/GSP 标签:在 JSP/GSP 页面通过相应的标签完成:

    Shiro 提供了 JSTL 标签用于在 JSP/GSP 页面进行权限控制,如根据登录用户显示相应的页面按钮。

    导入标签库

    <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

    <shiro:hasRole name="admin">
    <!— 有权限 —>
    </shiro:hasRole>

    授权流程

    流程如下:

    1. 首先调用 Subject.isPermitted*/hasRole*接口,其会委托给 SecurityManager,而 SecurityManager 接着会委托给 Authorizer;

    2. Authorizer 是真正的授权者,如果我们调用如 isPermitted(“user:view”),其首先会通过 PermissionResolver 把字符串转换成相应的 Permission 实例;

    3. 在进行授权之前,其会调用相应的 Realm 获取 Subject 相应的角色/权限用于匹配传入的角色/权限;

    4. Authorizer 会判断 Realm 的角色/权限是否和传入的匹配,如果有多个 Realm,会委托给 ModularRealmAuthorizer 进行循环判断,如果匹配如 isPermitted*/hasRole* 会返回 true,否则返回 false 表示授权失败。

    ModularRealmAuthorizer 进行多 Realm 匹配流程:

    • 首先检查相应的 Realm 是否实现了实现了 Authorizer;

    • 如果实现了 Authorizer,那么接着调用其相应的 isPermitted*/hasRole* 接口进行匹配;

    • 如果有一个 Realm 匹配那么将返回 true,否则返回 false。

    如果 Realm 进行授权的话,应该继承 AuthorizingRealm,其流程是:

    • 如果调用 hasRole*,则直接获取 AuthorizationInfo.getRoles() 与传入的角色比较即可;首先如果调用如 isPermitted(“user:view”),首先通过 PermissionResolver 将权限字符串转换成相应的 Permission 实例,默认使用 WildcardPermissionResolver,即转换为通配符的 WildcardPermission;

    • 通过 AuthorizationInfo.getObjectPermissions() 得到 Permission 实例集合;通过 AuthorizationInfo.getStringPermissions() 得到字符串集合并通过 PermissionResolver 解析为 Permission 实例;然后获取用户的角色,并通过 RolePermissionResolver 解析角色对应的权限集合(默认没有实现,可以自己提供);

    • 接着调用 Permission.implies(Permission p) 逐个与传入的权限比较,如果有匹配的则返回 true,否则 false。

    自定义 Realm设置权限

    public class MyRealm extends AuthorizingRealm {
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
            SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
            authorizationInfo.addRole("role1");
            authorizationInfo.addRole("role2");
            authorizationInfo.addObjectPermission(new BitPermission("+user1+10"));
            authorizationInfo.addObjectPermission(new WildcardPermission("user1:*"));
            authorizationInfo.addStringPermission("+user2+10");
            authorizationInfo.addStringPermission("user2:*");
            return authorizationInfo;
        }
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            //身份认证
        }
    }







    QQ群:785071190
    查看原文:http://www.coder306.cn/?p=210
  • 相关阅读:
    org.dom4j.DocumentException: null Nested exception: null
    严重: 文档无效: 找不到语法。 at (null:2:19)
    微信 群好友 的返回微信号 有阉割
    Perl 面向对象的真正意思
    门外汉怎么成就咨询大单(1)——北漂18年(39)
    Perl 微信模块--Weixin::Client
    Solr使用入门指南
    Perl 对象是函数的第一个参数
    haproxy 4层负载
    mysql 从读负载
  • 原文地址:https://www.cnblogs.com/coder306/p/13087671.html
Copyright © 2020-2023  润新知