Shiro8-自定义 Realm 进行授权

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

自定义 Realm

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

具体实现

    // 用于授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principals) {
        
        //从 principals获取主身份信息
        //将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到SimpleAuthenticationInfo中身份类型),
        String userCode =  (String) principals.getPrimaryPrincipal();
        
        //根据身份信息获取权限信息
        //连接数据库...
        //模拟从数据库获取到数据
        List permissions = new ArrayList();
        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 进行授权_第1张图片

你可能感兴趣的:(Shiro8-自定义 Realm 进行授权)