在实际开发中我们的权限数据都是从数据库中获取的, 所以就需要我们自定一个 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 查询到的权限数据中,说明用户有权限,否则没有权限.