在上一篇《Shiro – 登陆验证》中我们在自定义的UserRealm中继承了抽象类AuthorizingRealm,实现该类中的doGetAuthenticationInfo方法完成了登陆验证功能的实现。这次我们继续实现另一个方法doGetAuthorizationInfo()来实现权限控制功能。
授权也称为访问控制,是管理资源访问的过程。即根据不同用户的权限判断其是否有访问相应资源的权限。
在Shiro中,权限控制有三个核心的元素:权限,角色和用户。
数据库相关表设计
在这里,我们使用RBAC(Role-Based Access Control,基于角色的访问控制)模型设计用户,角色和权限间的关系。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。
在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。
根据以上模型设计如下简易表结构
接下来我们来实现Realm的doGetAuthorizationInfo()方法。
这里有两个比较重要的查询接口
将当前用户的角色集和权限集注入到Shiro中。
接下来我们来看下ShiroConfig中的配置,有什么变化;
shiro为我们提供了一些便利的权限注解
要想使用这些注解,需要在ShiroConfig加上如下配置
配置完成之后我们就可以直接使用这些注解了。
本以为在ShiroConfig中配置了shiroFilterFactoryBean.setUnauthorizedUrl("/403");
,当访问的时候,没有权限的访问会自动重定向到/403,结果证明并不是这样。后来研究发现,该设置只对filterChain起作用,比如在filterChain中设置了filterChainDefinitionMap.put("/user/update", "perms[user:update]");
,如果用户没有user:update
权限,那么当其访问/user/update
的时候,页面会被重定向到/403。
相关解释可参考:
针对以上问题,我们可以定义一个全局异常捕获类