在我们做后台管理系统的时候,认证授权是必不可少的功能!我们经常会选择Shiro、Spring Security这类权限认证框架来实现,但这些框架使用起来有点繁琐,而且功能也不够强大。本节课程将带大家学习一款功能强大的权限认证框架Sa-Token,它使用简单、API设计优雅!
Sa-Token简介
Sa-Token是一款轻量级的Java权限认证框架,可以用来解决登录认证、权限认证、Session会话、单点登录、OAuth2.0、微服务网关鉴权等一系列权限相关问题。
框架集成简单、开箱即用、API设计优雅,通过Sa-Token,你将以一种极其简单的方式实现系统的权限认证部分,有时候往往只需一行代码就能实现功能。
Sa-Token功能很全,具体可以参考下图。
使用
在SpringBoot中使用Sa-Token是非常简单的,接下来我们使用它来实现最常用的认证授权功能,包括登录认证、角色认证和权限认证。
集成及配置
Sa-Token的集成和配置都非常简单,不愧为开箱即用。
- 首先我们需要在项目的
pom.xml
中添加Sa-Token的相关依赖,使用JWT类型的Token还需添加JWT相关依赖;
<dependencies>
<!-- Sa-Token 权限认证 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId>
<version>${sa-token.version}</version>
</dependency>
<!-- Sa-Token 整合 jwt -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jwt</artifactId>
<version>${sa-token.version}</version>
</dependency>
</dependencies>
- 然后在
application.yml
中添加Sa-Token的相关配置,考虑到要支持前后端分离项目,我们关闭从cookie中读取token,改为从head中读取token;
# Sa-Token配置
sa-token:
# token名称 (同时也是cookie名称)
token-name: Authorization
# token有效期,单位秒,-1代表永不过期(60*60*24*7)
timeout: 604800
# token临时有效期 (指定时间内无操作就视为token过期),单位秒
active-timeout: -1
# 是否允许同一账号并发登录 (为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个token (为false时每次登录新建一个token)
is-share: false
# token风格
token-style: uuid
# 是否输出操作日志
is-log: false
# 是否从cookie中读取token
is-read-cookie: false
# 是否从head中读取token
isReadHeader: true
# token前缀
token-prefix: Bearer
# jwt秘钥
jwt-secret-key: sa-secret-key123
- 还需添加一个Java配置类
SaTokenConfig
,添加JWT相关配置。
/**
* @auther macrozheng
* @description Sa-Token相关配置
* @date 2023/11/28
* @github https://github.com/macrozheng
*/
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
// Sa-Token 整合 jwt (Simple 简单模式)
@Bean
public StpLogic getStpLogicJwt() {
return new StpLogicJwtForSimple();
}
}
登录认证
在管理系统中,除了登录接口,基本都需要登录认证,在Sa-Token中使用路由拦截鉴权是最方便的,下面我们来实现下。
- 实现登录认证非常简单,首先在
UmsAdminController
中添加一个登录接口;
/**
* @auther macrozheng
* @description 后台用户管理
* @date 2018/4/26
* @github https://github.com/macrozheng
*/
@Controller
@Tag(name = "UmsAdminController",description = "后台用户管理")
@RequestMapping("/admin")
publ