一、什么是Shiro
Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。
三个核心组件:Subject, SecurityManager 和 Realms
三大核心组件:
Subject:主体
主体,代表了当前的“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是主体,如第三方进程、网络爬虫、机器人等,Subject是一个抽象概念,所有的Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager,可以把Subject认为是一个门面;SecurityManager才是实际的执行者;
SecurityManager:安全管理器
安全管理器,即所有与安全有关的操作都会与SecurityManager进行交互,是Shiro框架的核心,管理所有的Subject,类似于Spring
MVC的前端控制器DispatcherServlet;
Realm:域
Shiro从Realm中获取安全数据(比如用户、角色、权限),SecurityManager要验证用户身份,需要从Realm中获取相应的用户进行比较确定用户是否合法;验证用户角色/权限也需要从Realm获得相应数据进行比较,类似于DataSource,安全数据源;它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。
需要注意的是:Shiro本身不提供维护用户、权限,而是通过Realm让开发人员自己注入到SecurityManager,从而让SecurityManager能得到合法的用户以及权限进行判断;
二、项目代码实战
1.项目依赖
只说明Shiro和JWT的依赖SpringBoot的自己配置
<!--整合Shiro安全框架-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.8.0</version>
</dependency>
<!--集成jwt实现token认证-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.2.0</version>
</dependency>
2.JWT工具类编写
既然要使用JWT第一步我们直接先准备JWT工具类编写
博主只是根据自己的需求去传入的参数,如果项目不一样,自行更改就好了
JWT就不用多说了吧
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Date;
/**
* @program:
* @description:
* @author: sun jingchun
* @create: 2021-10-26 16:47
**/
public class JwtUtils {
/**
* 密钥
* */
private static final String SECRET = "889556654";
public static String createToken(String username, String password) throws UnsupportedEncodingException {
//设置token时间 三小时
Calendar nowTime = Calendar.getInstance();
nowTime.add(Calendar.HOUR, 3);
Date date = nowTime.getTime();
//密文生成
String token = JWT.create()
.withClaim("username", username)
.withClaim("password", password)
.withExpiresAt(date)
.withIssuedAt(new Date())
.sign(Algorithm.HMAC256(SECRET));
return token;
}
/**
* 验证token的有效性
* */
public static boolean verify(String token) {
try {
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
verifier.verify(token);
return true;
} catch (UnsupportedEncodingException e) {
return false;
}
}
/**
* 获取token列名
* **/
/**
* 通过载荷名字获取载荷的值
* */
public static String getClaim(String token, String name){
String claim = null;
try {
claim = JWT.decode(token).getClaim(name).asString();
}catch (Exception e) {
return "getClaimFalse";
}
return claim;
}
3.编写一个JwtToken.class
编写一个JwtToken.c类 继承 AuthenticationToken 之后会用到
import org.apache.shiro.authc.AuthenticationToken;
/**
* @program:
* @description:
* @author: sun jingchun
* &#