美文网首页
Shiro8-自定义 Realm 进行授权

Shiro8-自定义 Realm 进行授权

作者: 我相信你爱过gg | 来源:发表于2017-05-19 21:13 被阅读51次

    在实际开发中我们的权限数据都是从数据库中获取的, 所以就需要我们自定一个 Realm 从数据库进行查询权限数据,将权限数据返回给 authorizer(授权器).

    自定义 Realm

    我们在原来的那个自定义 Realm 中修改 doGetAuthorizationInfo 方法,就可以.

    具体实现

        // 用于授权
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(
                PrincipalCollection principals) {
            
            //从 principals获取主身份信息
            //将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到SimpleAuthenticationInfo中身份类型),
            String userCode =  (String) principals.getPrimaryPrincipal();
            
            //根据身份信息获取权限信息
            //连接数据库...
            //模拟从数据库获取到数据
            List<String> permissions = new ArrayList<String>();
            permissions.add("user:create");//用户的创建
            permissions.add("items:add");//商品添加权限
            //....
            
            //查到权限数据,返回授权信息(要包括 上边的permissions)
            SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
            //将上边查询到授权信息填充到simpleAuthorizationInfo对象中
            simpleAuthorizationInfo.addStringPermissions(permissions);
    
            return simpleAuthorizationInfo;
        }
    

    授权流程

    1.对 subject 进行授权, 调用方法 isPermitted("")
    2.SecurityManager 执行授权, 通过 ModularRealmAuthorizer 执行授权.
    3.ModularRealmAuthorizer 调用 Realm(我们自定义的)的 doGetAuthorizationInfo 方法 从数据库查询权限数据, 并返回给ModularRealmAuthorizer.
    4.ModularRealmAuthorizer 调用 PermissionResolver 进行权限对比.
    5.对比后,如果 isPermitted 方法中的参数在 realm 查询到的权限数据中,说明用户有权限,否则没有权限.

    相关文章

      网友评论

          本文标题:Shiro8-自定义 Realm 进行授权

          本文链接:https://www.haomeiwen.com/subject/xpiyxxtx.html