简介
Shiro是apache旗下一个开源安全框架,将软件系统的安全认证相关的功能:身份认证,权限授权、加密、会话管理等功能组合成了一个通用的安全认证框架.
结构
subject
Subject(主体对象):负责提交用户认证和授权信息(用户/第三方服务)
SecurityManager
SecurityManager(安全管理器):Shiro的核心,用来协调管理组件工作
其包含组件有:
- Authenticator(认证管理器):负责执行认证操作。
- Authorizer(授权管理器):负责授权检测。
- SessionManager(会话管理):负责创建并管理用户 Session 生命周期,提供一个强有力的 Session 体验。
- SessionDAO:代表 SessionManager 执行 Session 持久(CRUD)动作,它允许任何存储的数据挂接到 session 管理基础上。
- CacheManager(缓存管理器):提供创建缓存实例和管理缓存生命周期的功能。
- Realms(领域对象):是shiro和你的应用程序安全数据之间的桥梁
Cryptography
Cryptography(加密管理器):提供了加密方式的设计及管理
认证拦截实现
添加依赖
pom.xml中添加:
org.apache.shiro
shiro-spring
1.5.3
实现
1.创建一个shiro配置类,由@Configuration注解描述
package com.cy.pj.common.config;
@Configuration
public class SpringShiroConfig {
}
2.在Shiro配置类中添加SecurityManager配置(这里一定要使用org.apache.shiro.mgt.SecurityManager这个接口对象)不要导错包
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager sManager=
new DefaultWebSecurityManager();
return sManager;
}
3.在Shiro配置类中添加ShiroFilterFactoryBean对象的配置。通过此对象设置资源匿名访问、认证访问
@Bean
public ShiroFilterFactoryBean shiroFilterFactory (
SecurityManager securityManager) {
ShiroFilterFactoryBean sfBean=
new ShiroFilterFactoryBean();
sfBean.setSecurityManager(securityManager);
//定义map指定请求过滤规则(哪些资源允许匿名访问,哪些必须认证访问)
LinkedHashMap map= new LinkedHashMap<>();
//静态资源允许匿名访问:"anon"
map.put("/bower_components/**","anon");
map.put("/build/**","anon");
map.put("/dist/**","anon");
map.put("/plugins/**","anon");
//除了匿名访问的资源,其它都要认证("authc")后访问
map.put("/**","authc");
sfBean.setFilterChainDefinitionMap(map);
return sfBean;
}
4.在Controller层添加呈现登陆页面的方法doLoginUI
5.修改SpringShiroConfig类中shiroFilterFactorybean的配置,添加登陆url的设置-- 标识
@Bean
public ShiroFilterFactoryBean shiroFilterFactory (
SecurityManager securityManager) {
ShiroFilterFactoryBean sfBean=
new ShiroFilterFactoryBean();
sfBean.setSecurityManager(securityManager);
**sfBean.setLoginUrl("/doLoginUI")**
//定义map指定请求过滤规则(哪些资源允许匿名访问,哪些必须认证访问)
LinkedHashMap map= new LinkedHashMap<>();
//静态资源允许匿名访问:"anon"
map.put("/bower_components/**","anon");
map.put("/build/**","anon");
map.put("/dist/**","anon");
map.put("/plugins/**","anon");
//除了匿名访问的资源,其它都要认证("authc")后访问
map.put("/**","authc");
sfBean.setFilterChainDefinitionMap(map);
return sfBean;
}
认证业务
流程
身份认证即判定用户是否是系统的合法用户,用户访问系统资源时的认证(对用户身份信息的认证)
业务主要就是:
1)realm从数据层取到用户信息
2)客户端传递用户输入信息
3)在Authenticator认证管理器中进行操作
授权业务
流程
授权即对用户资源访问的授权(是否允许用户访问此资源),用户访问系统资源时的授权流程
业务主要就是:
1)realm从数据层取到用户信息
2)客户端传递用户输Authorizer授权管理器中进行操作