Shior 框架进阶(六)
----------自定义Realm授权
之前的文章当中我们有说明自定义的Realm认证,但是继承的类当中只有认证的方法没有授权的方法,但是在实际的运用过程当中认证和授权往往是在一起使用的,当你认证成功过之后,所返回的信息会被授权的方法收到,他会根据你认证完成之后返回的信息来进行授权,当然由解决的方式那就是扩展类AuthorizingRealm它里面由两个方法,一个是授权一个是认证,下文将实现的就是这种方法;
那么接下来我们就来说明自定义的Realm授权,这李我们的权限信息任然是写在ini文件当中,在项目整合的时候这些信息由两种写法,一种实在shiro的配置文件当中,另一种就是实现配置文件当中的ShiroFilterFactoryBean
采用map的方式来添加,这个会在最后的整合当中来说明:
接下来就来看这种自定义的Realm授权:
1、ini中配置realm shirorealmauthorization.ini
[main]
#自定义 realm
customRealm=com.qfedu.shirodemo.realm.CustomRealm2
#将realm设置到securityManager,相当 于spring中注入
securityManager.realms=$customRealm
2、自定义realm
从认证的realm拷贝,
改变继承的抽象父类,添加新的方法 为了测试方便,可以定和上一节的例子中的ini文件一致的权限和角色信息
public class CustomRealm2 extends AuthorizingRealm {
/**
* 用于认证
* @param authenticationToken
* @return
* @throws AuthenticationException
*/ @Override
protected AuthenticationInfo
doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws
AuthenticationException {
//将之前的认证代码复制过来即可
}
/**
* 用于授权
* @param principals
* @return
*/ @Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//从 principals获取主身份信息
//将getPrimaryPrincipal方法返回值转为真实身份类型
// (在上边的doGetAuthenticationInfo认证通过并填充到SimpleAuthenticationInfo中的身份类型),
String userCode = (String) principals.getPrimaryPrincipal();
System.out.println("用户信息:" + userCode);
//模拟从数据库获取到权限数据
List<String> permissions = new ArrayList<String>();
permissions.add("system:user:*");
permissions.add("system:menu:*");
permissions.add("system:config:*");
//模拟从数据库获取到角色数据
List<String> roles = new ArrayList<String>();
roles.add("role1");
roles.add("role3");
//初始化授权对象
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
//授权权限
simpleAuthorizationInfo.addStringPermissions(permissions);
//授权角色
simpleAuthorizationInfo.addRoles(roles);
return simpleAuthorizationInfo;
}
}
3、测试 直接
只需要修改加载配置文件的文件名即可,可在本系列的第一篇上面找到测试的代码;
注意:测试时会发现,每次进行权限和角色的比对时都会执行授权的代码,效率低。后面会讲到缓存的问题
String userCode = (String) principals.getPrimaryPrincipal();
System.out.println("用户信息:" + userCode);
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42112846;