Spring boot+Shiro
一、Shiro框架
1、官方文档:http://shiro.apache.org/index.html
shrio是一个基于Java的安全认证框架,是一个轻量级的安全框架,主要的作用是在后端承担认证和授权的工作,可在JavaSE和JavaEE环境中使用
2、shiro架构

- Authentication:有时称为“登录”,这是证明用户是他们所说的身份的行为。
- Authorization:**访问控制的过程,即确定“谁”有权访问“什么”。
- Session Management:即使在非Web或EJB应用程序中,也管理用户特定的会话。
- Cryptography:使用密码算法保持数据安全,同时仍然易于使用。
在不同的应用程序环境中,还具有其他功能来支持和加强这些问题,尤其是:
- Web Support:Shiro的Web支持API可帮助轻松保护Web应用程序。
- Caching:缓存是Apache Shiro API的第一层公民,可确保安全操作保持快速有效。
- Concurrency:Apache Shiro的并发功能支持多线程应用程序。
- Testing:测试支持可以帮助您编写单元测试和集成测试,并确保您的代码将按预期进行保护。
- “Run As”:一种功能,允许用户采用其他用户的身份(如果允许),有时在管理方案中很有用。
- “Remember Me”:在整个会话中记住用户的身份,因此他们仅在必要时登录。
在认证过程中有三个核心的对象:Subject,SecurityManager和Realm(s)

-
Subject:Subject本质上是当前正在执行的用户的安全特定“视图”,是shiro对外的API核心。Subject代表了当前的用户,可以是一个人,但它也可以表示第三方服务,守护程序帐户。
Subject只是一个门面,其内部有关操作都交给了SecurityManager去执行
-
SecurityManager:是Shiro体系结构的核心,并充当一种“伞”对象,该对象协调其内部安全组件,这些安全组件一起形成对象图。相当于sprintmvc的dispatcherServlet,负责其他组件与shiro的交互
-
Realm:领域充当Shiro与应用程序的安全数据之间的“桥梁”或“连接器”。可以执行身份验证(登录)和授权(访问控制),相当于数据库中的DataSource,可以自定义该类
二、在Springboot中配置shiro
1、导包
<!--shiro-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.5.3</version>
</dependency>
<!--shiro注解支持需要aop的支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、开启aop的自动代理
sprint:
aop:
proxy-target-class: true
3、自定义Realm
@Slf4j
public class ShiroRealm extends AuthorizingRealm {
@Lazy
@Resource
private RedisUtil redisUtil;
@Autowired
private SysUserDao sysUserDao;
/**
* 重写身份令牌验证方式
* 若返回false则在执行登录操作时会报org.apache.shiro.authc.pam.UnsupportedTokeException
* 即不支持的身份令牌
*/
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof JwtToken;
}
/**
* 权限信息认证(包括角色认证以及权限认证):是用户访问controller的时候才进行验证
* 触发检测用户权限时才会调用此方法,例如checkRole,checkPermission
*
* @param principals 身份信息
* @return AuthorizationInfo 权限信息
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
/**
* 用户信息认证:在用户进行登录的时候进行验证
*
* @param auth 用户登录的账号密码信息
* @return 返回封装了用户信息的 AuthenticationInfo 实例
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
String token = (String) auth.getCredentials();
if (token == null) {
throw new AuthenticationException("token为空!");
}
// 校验token有效性
LoginUser loginUser = this.checkUserTokenIsEffect(token);
//可进行一系列验证。。。
/**
* 封装用户的登录数据
*/
return new SimpleAuthenticationInfo(loginUser, token, getName());
}
/**
* 清除当前用户的权限认证缓存
*
* @param principals 权限信息
*/
@Override
public void clearCache(PrincipalCollection principals) {
super.clearCache(principals);
}
}
SimpleAuthenticationInfo源码解析
- 构造方法的第一个参数指定了登录的用户数据
- 第二个参数用来校验第一个参数所指定的用户,一般可为用户的token或password
- 第三个参数指定了授权的对象名
/**
* Constructor that takes in a single 'primary' principal of the account and its corresponding credentials,
* associated with the specified realm.
* <p/>
* This is a convenience constructor and will construct a {@link

本文详细介绍了Apache Shiro框架的原理、在Springboot中的配置以及Shiro的认证过程。Shiro是一个轻量级的安全框架,用于处理认证、授权、会话管理和加密。在Springboot中配置Shiro涉及导入依赖、开启AOP、自定义Realm并配置ShiroFilter。认证过程中,Shiro首先通过Subject.login()方法,然后由SecurityManager进行身份验证,最终在 Realm 中完成用户信息的校验。通过对UsernamePasswordToken的处理,实现了用户登录的完整流程。
最低0.47元/天 解锁文章
387

被折叠的 条评论
为什么被折叠?



