SpringBoot搭建Shiro的快速入门

本文介绍了Shiro的基本概念,如Subject、SecurityManager和Realm,详细阐述了Shiro的认证和授权流程。接着,文章展示了如何在SpringBoot项目中集成Shiro,包括配置SecurityManager、自定义Realm和权限拦截。通过具体的代码示例,演示了Shiro的登录、认证和授权过程,以及在实际应用中可能出现的问题和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Shiro

Shiro官网

1.1 Shiro简介

以下为Shiro的简单介绍:

  1. Shiro 是一个强大、简单易用的 Java 安全权限框架
  2. Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在 JavaEE 环境
  3. Shiro 可以完成:认证、授权、加密、会话管理、与Web 集成、缓存等。

具体的信息可进一步查看Shiro官网

1.2 Shiro三大核心组件

Shiro 有三大核心组件,即 Subject、SecurityManager 和 Realm。它们的关系如下图:
在这里插入图片描述

1.2.1 Subject

Subject 为认证主体,它包含 Principals 和 Credentials 两个信息。

  • Principals:代表身份。可以是用户名、邮件、手机号码等等,用来标识一个登录主体的身份
  • Credentials:代表凭证。常见的有密码,数字证书等等。

简单来说:这两者代表了需要认证的内容,最常见的便是用户名、密码了

1.2.2 SecurityManager

SecurityManager 为安全管理员,它是Shiro 架构的核心。所有具体的交互都通过SecurityManager进行控制;负责所有Subject、且负责进行认证和授权、及会话、缓存的管理

1.2.3 Realm

Realm 是一个域,它是连接 Shiro 和具体应用的桥梁。当需要与安全数据交互时,比如用户账户、访问控制等,Shiro 将会在一个或多个 Realm 中查找。

1.3 Shiro的认证和授权流程

官方的入门实例:http://shiro.apache.org/tutorial.html
大致代码如下:
shiro.ini

[users]
root = secret, admin
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr = vespa, goodguy, schwartz

[roles]
admin = *
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5

ini文件大致意思是:

  1. root=secret,admin:用户名root,密码secret,角色是admin
  2. schwartz=lightsaber:* :角色schwartz拥有权限 lightsaber:*

Java代码

public static void main(String[] args) {
   
	Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
	SecurityManager securityManager = factory.getInstance();
	SecurityUtils.setSecurityManager(securityManager);
	
	Subject currentUser = SecurityUtils.getSubject();
	
	if ( !currentUser.isAuthenticated() ) {
   
		UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
	    token.setRememberMe(true);
	    currentUser.login(token);
	}
	
	if ( currentUser.hasRole( "schwartz" ) ) {
   
	    log.info("May the Schwartz be with you!" );
	} else {
   
	    log.info( "Hello, mere mortal." );
	}
	
	if ( currentUser.isPermitted( "lightsaber:wield" ) ) {
   
	    log.info("You may use a lightsaber ring.  Use it wisely.");
	} else {
   
	    log.info("Sorry, lightsaber rings are for schwartz masters only.");
	}
	...
}

上面代码主要有两个步骤:
认证:

UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
token.setRememberMe(true);
currentUser.login(token);

判断权限:

currentUser.hasRole( "schwartz" )

1.3.1 认证流程

在这里插入图片描述
shiro的认证流程如下:

  1. Subject进行login操作,参数是封装了用户信息的token
  2. Security Manager进行登录操作
  3. Security Manager委托给Authenticator进行认证逻辑处理
  4. 调用AuthenticationStrategy进行多Realm身份验证
  5. 调用对应Realm进行登录校验,认证成功则返回用户属性,失败则抛出对应异常

1.3.2 授权流程

在这里插入图片描述
授权流程如下:

  1. 调用Subject.isPermitted()/hasRole()方法
  2. 委托给SecurityManager
  3. 而SecurityManager接着会委托给Authorizer
  4. Authorizer会判断Realm的角色/权限是否和传入的匹配
  5. 匹配如isPermitted/hasRole会返回true,否则返回false表示授权失败

2. SpringBoot集成Shiro并完成登录操作

2.1 项目信息

2.1.1 开发环境

IDEA:2018.2(lombok插件)
SpringBoot:2.3.1.RELEASE
Shiro:1.3.2
freemarker(前端页面)

2.1.2 项目结构图

在这里插入图片描述

2.1.3 pom依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值