shiro的三大核心组件
一、什么是shiro?
shiro是一个强大的Java安全框架,执行身份验证。授权、密码和会话管理的。使用shiro易于理解API,可以非常方便的集成到任何应用程序中。
在这里也说明一下:后续会写关于Spring Security这款安全框架,两者在功能上是非常类似的,所以在学习完一种后最后把另一种也学习一下。
二、shiro的三大核心组件
1、subject:简单理解为表示当前操作用户。其实它的深层表达的意思是第三方的进程。意味这与当前系统交互的"东西"。
那这里人是直接操作我们的系统,所以一般情况下,subject就是当前用户,可以通过subject轻松获取需要登录认证的用户名密码涉及到安全的操作数据。
2、securityManager : 它是shiro框架的核心,是一种典型的Facade模式,shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
3、Realm: Realm是shiro框架中与应用安全数据间的桥梁或者连接器,直白的说当用户需要登录认证/授权的时候,shiro会从应用配置的Realm中查找用户及其权限信息。
其中值得注意的是:在配置shiro时,你必须至少指定一个Realm,用户认证或者授权,可以配置多个Realm.
三、SpringBoot集成Shiro
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
1
2
3
4
5
在项目中我们一般会配置一个shiroConfig配置类,这里面会配置我们shiro中非常重要的认证、访问控制信息以及我们上面说的Realm的管理。
我把我写的一个shiroConfig例子写出来大家参考一下:
/**
* 2020/05/20
*/
@Configuration
public class ShiroConfig {
//配置Shiro的安全管理器
@Bean
public SecurityManager securityManager(Realm myRealm){
DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
//设置一个Realm,这个Realm是最终用于完成我们的认证号和授权操作的具体对象
securityManager.setRealm(myRealm);
return securityManager;
}
//配置一个自定义的Realm的bean,最终将使用这个bean返回的对象来完成我们的认证和授权
@Bean
public Realm myRealm(){
MyRealm realm=new MyRealm();
return realm;
}
//配置一个Shiro的过滤器bean,这个bean将配置Shiro相关的一个规则的拦截
//例如什么样的请求可以访问什么样的请求不可以访问等等
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){
//创建Shiro的拦截的拦截器 ,用于拦截我们的用户请求
ShiroFilterFactoryBean shiroFilter=new ShiroFilterFactoryBean();
//设置Shiro的安全管理,设置管理的同时也会指定某个Realm 用来完成我们权限分配
shiroFilter.setSecurityManager(securityManager);
//用于设置一个登录的请求地址,这个地址可以是一个html或jsp的访问路径,也可以是一个控制器的路径
//作用是用于通知Shiro我们可以使用这里路径转向到登录页面,但Shiro判断到我们当前的用户没有登录时就会自动转换到这个路径
//要求用户完成成功
shiroFilter.setLoginUrl("/");
//登录成功后转向页面,由于用户的登录后期需要交给Shiro完成,因此就需要通知Shiro登录成功之后返回到那个位置
shiroFilter.setSuccessUrl("/success");
//用于指定没有权限的页面,当用户访问某个功能是如果Shiro判断这个用户没有对应的操作权限,那么Shiro就会将请求
//转向到这个位置,用于提示用户没有操作权限
shiroFilter.setUnauthorizedUrl("/noPermission");
//定义一个Map集合,这个Map集合中存放的数据全部都是规则,用于设置通知Shiro什么样的请求可以访问什么样的请求不可以访问
Map<String,String> map=new LinkedHashMap<String,String>();
// /login 表示某个请求的名字 anon 表示可以使用游客什么进行登录(这个请求不需要登录)
map.put("/login","anon");
//我们可以在这里配置所有的权限规则这列数据真正是需要从数据库中读取出来
//或者在控制器中添加Shiro的注解
// /admin/** 表示一个请求名字的通配, 以admin开头的任意子孙路径下的所有请求
// authc 表示这个请求需要进行认证(登录),只有认证(登录)通过才能访问
// 注意: ** 表示任意子孙路径
// * 表示任意的一个路径
// ? 表示 任意的一个字符
map.put("/admin/**","authc");
map.put("/user/**","authc");
//表示所有的请求路径全部都需要被拦截登录,这个必须必须写在Map集合的最后面,这个选项是可选的
//如果没有指定/** 那么如果某个请求不符合上面的拦截规则Shiro将方行这个请求
// map.put("/**","authc");
shiroFilter.setFilterChainDefinitionMap(map);
return shiroFilter;
}
}
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
里面配置了一些简单的登录URL、登录成功的URL、和nopermission没有权限的URL。然后又MyRealm对象交由spring来管理。后面的有一个类似于拦截器功能的/admin/** … 。作为需要认证还是不需要认证、需要相应角色、权限等。