使用PermissionsAuthorizationFilter
在applicationContext-shiro.xml中配置url所对应的权限
测试流程:
1、在applicationContext-shiro.xml中配置filter规则
<!--商品查询需要商品查询权限 -->
/items/queryItems.action = perms[item:query]
2、用户在认证通过后,请求/items/queryItems.action
3、被PermissionsAuthorizationFilter拦截,发现需要“item:query”权限
4、PermissionsAuthorizationFilter调用realm中的doGetAuthorizationInfo获取数据库中正确的权限
5、PermissionsAuthorizationFilter对item:query 和从realm中获取权限进行对比,如果“item:query”在realm返回的权限列表中,授权通过
在realm中写授权的方法
// 用于授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
//从 principals获取主身份信息
//将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到SimpleAuthenticationInfo中身份类型),
String userCode = (String)principals.getPrimaryPrincipal();
//根据身份信息获取权限的信息
//模拟从数据库中取得该用户的权限信息
List<String> permissions = new ArrayList<String>();
/**
* 用户的查询权限,这个权限拥有了 这个权限,当该用户访问
* /items/queryItem.action = perms[item:query]
* 时就不会被拦截住
* 就是说这个用户拥有该资源的访问权限
*/
permissions.add("item:query");
//查询权限数据,返回授权信息
SimpleAuthorizationInfo sAuthorizationInfo = new SimpleAuthorizationInfo();
//将用户的权限信息填充到sAuthorizationInfo中返回
sAuthorizationInfo.addStringPermissions(permissions);
return sAuthorizationInfo;
}
如果授权失败,跳转到refuse.jsp,需要在spring容器中配置:已经在applicationContext-shiro.xml中配置了
<!-- 这是认证之后访问没有权限的资源,会统一跳转到这个jsp -->
<property name="unauthorizedUrl" value="/refuse.jsp"></property>
但是这种授权的方式存在两个问题
1、在applicationContext-shiro.xml中配置过虑器链接,需要将全部的url和权限对应起来进行配置,比较发麻不方便使用。
2、每次授权都需要调用realm查询数据库,对于系统性能有很大影响,可以通过shiro缓存来解决
可以通过下一章的注解和标签来解决这些问题