拥有指定的权限才可以进行相应的操作。
有一些操作是所有人都可以执行的,比如:访问首页、访问登录界面。而有一些就需要管理员权限,比如:删除用户。
为了实现这种功能,Shiro 提供了角色和权限两个概念。
推荐一篇博客:Spring Boot Shiro权限控制
我的理解是:一个用户对应一个或多个角色,一个角色又对应一个或多个权限。这样一来,用户就对应了多个明确的角色或者权限。然后设置接口所需要的角色或权限,实现权限控制。
在 Web 应用中,角色、权限都存放在数据库中,当然了还有用户表,以及用户-角色表、角色-权限表,总共有五个数据表。
当 Shiro 需要验证权限的时候,就需要从数据库中查找数据。
那么需要查找的是什么呢?
先看看 Shiro 需要的是什么。Realm 除了认证功能之外,还有授权的功能,对应的就是 doGetAuthorizationInfo 方法。在这个方法中返回的是一个 AuthorizationInfo 对象,而这个对象有两个方法:setRoles 和 setStringPermissions。
也就是说,Shiro 需要用户所对应的多个角色,以及多个权限。那么在数据访问层要做的就是查找一个用户所对应的角色和权限。
大概了解授权的流程之后,下面就具体说该怎么做。
创建数据表
建议阅读上面推荐的文章,讲得比较详细。
1 | CREATE DATABASE /*!32312 IF NOT EXISTS*/`shiro-login` /*!40100 DEFAULT CHARACTER SET utf8 */; |
插入数据
数据仅供参考,根据自己的设计插入数据。
1 | CREATE DATABASE /*!32312 IF NOT EXISTS*/`shiro-login` /*!40100 DEFAULT CHARACTER SET utf8 */; |
创建实体类
使用 IDEA 自动生成即可。
UserRoleMapper
根据用户名查找角色集:
1 |
|
UserPermissionMapper
根据用户名查找权限集:
1 |
|
Realm 添加方法
1 |
|
添加权限控制
方法一:配置文件中
在 ShiroConfig 类的 shiroFilterChainDefinition 方法中:
1 |
|
方法二:使用注解
在 Controller 的接口上配置:
1 | // 表示当前Subject已经通过login进行了身份验证;即Subject.isAuthenticated()返回true。 |
定义授权失败跳转页面
在 properties 文件中:
1 | shiro.unauthorizedUrl=/error123 |
捕获全局异常
两种情况
- 一个接口使用注解指定了所需要的权限,当没有登录或者没有权限访问这个接口时,它不会跳转到失败页面,也不会跳转到登录页面,而是抛出一个异常。
- 在配置文件中指定一个接口所需的权限,那么它就会跳转到错误页面或者登录界面。
为了解决第一种情况,就需要捕获异常:
1 |
|
总结
- 创建角色和权限
- 查询角色和权限
- 重写 doGetAuthorizationInfo
- 给接口配置权限