Spring boot+Shiro

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

一、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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值