整合Shiro
1.介绍
是一个主流的java安全框架,主要作用是对访问系统的用户进行身份认证、授权、会话管理、加密等操作。
Shiro就是用来解决安全管理的系统化框架。
2.Shiro核心组件
首先要明白用户、角色(身份)、权限之间的关系:将权限赋给角色,将角色赋给用户。
Shiro核心组件如下:
1、UsernamePasswordToken:用来封装用户登录信息,使用用户的登录信息来创建令牌Token。
2、SecurityManage:Shiro的核心部分,负责安全认证和授权。
3、Suject:Shiro的一个抽象概念,包含了用户信息。
4、Realm:开发者自定义的模块,根据项目的需求,验证和授权的逻辑全写到Realm里。
5、AuthenticationInfo:用户的角色信息集合,在认证时使用。
6、AuthorzationInfo:用户的权限信息集合,在授权是时使用。
7、DefaultWebSecurityDManager:安全管理器,开发者自定义的Realm需要注入到DefaultWebSecurityDManager进行管理才能生效。
8、ShiroFilterFactoryBean:过滤器工厂,Shiro的基本运行机制是开发者制定规则,Shiro去执行,具体的执行操作就是由ShiroFilterFactoryBean创建的一个个Filter对象来完成。
3.SpringBoot整合Shiro
1、导包
1 | <dependency> |
2、建表
1 | # 为了方便演示,这里把权限与角色字段都放在了一张表中。 |
3、自定义Realm
1 | public class UserRealm extends AuthorizingRealm{ |
4、写配置类,使UserRealm类生效。
1 |
|
5、创建5个页面,login.html、index.html、main.html、manage.html、admin.html
页面访问权限如下: (规则在上面的配置类中设置)
- 必须登录才能访问:main.html
- 用户必须拥有manage授权才能访问:manage.html
- 用户必须拥有admin角色才能访问:admin.html
- 任何人都可访问:login.html、index.html(里面有main.html、manage.html、admin.html的访问链接)
6、Controller层
1 |
|
7、index.html显示当前登录用户权限对应的链接,不属于用户权限的链接不予显示。
7.1、首先要引入Shiro整合thymeleaf的依赖。
1 | <dependency> |
7.2、在Shiro配置类中加入ShiroDialect(Shiro方言),为的是让thymeleaf能识别Shiro语言。
1 |
|
7.3、修改index.html
- 添加Shiro命名空间。
- 判断是否拥有某个权限。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>首页</h1>
<div th:if="${session.user != null}">
<span th:text="${session.user.name} + '欢迎回来!'"></span>
<a th:href="@{/logout}">退出</a>
</div>
<!--main不用判断,我们要求的是只要登录就可以访问-->
<a th:href="@{/main}">main</a>
<div shiro:hasPermission="manage">
<a th:href="@{/manage}" >manage</a>
</div>
<div shiro:hasRole="admin">
<a th:href="@{/admin}">admin</a>
</div>
</body>
</html>