【Sa-Token】Spring Boot项目中使用Sa-Token框架

一、初识Sa-Token框架

Sa-Token是一个功能强大且易于使用的由Java编写的国产权限认证和会话管理框架。它提供了一套简单而灵活的API,可以帮助开发人员轻松地实现身份验证、权限控制和会话管理的功能。

以下是Sa-Token框架的主要特点和功能:

  1. 简单易用:Sa-Token提供了简洁而直观的API,使得权限认证和会话管理变得简单易懂。开发人员可以快速集成和使用该框架,无需花费太多时间和精力。

  2. 多种登录验证方式:Sa-Token支持多种登录验证方式,包括基于Session的Cookie验证、基于Token的无状态验证、基于URL参数的验证等。这样,开发人员可以根据项目需求选择适合的验证方式。

  3. 细粒度的权限控制:Sa-Token提供了细粒度的权限控制机制,可以通过注解或编程方式进行配置。您可以轻松定义角色、权限和资源,并在代码中进行权限检查,确保只有具备相应权限的用户可以访问受保护的资源。

  4. 会话管理和单点登录:Sa-Token支持会话管理和单点登录功能,可以轻松处理用户的登录状态和会话信息。开发人员可以管理会话的生命周期、设置会话属性、注销会话等操作,并确保用户在多个系统之间实现无缝的单点登录。

  5. 集成简便:Sa-Token可以与各种常见的Java框架无缝集成,包括Spring Boot、Spring MVC、Spring Security等。无论您使用哪个框架,都可以轻松地将Sa-Token集成到您的项目中,并与其他框架或库进行配合使用。

  6. 丰富的扩展功能:Sa-Token提供了丰富的扩展功能,例如IP黑白名单、自定义过滤器、自定义注解等。这些扩展功能可以帮助开发人员满足更多特定需求,并提供更加灵活和定制化的权限认证和会话管理解决方案。

总而言之,Sa-Token是一个功能强大、易于使用且灵活的Java权限认证和会话管理框架。它可以帮助开发人员快速实现身份验证、权限控制和会话管理的功能,并提供了丰富的扩展功能以满足各种需求。

二、Spring Boot集成Sa-Token框架

在pom.xml文件中,引入相关的依赖库,作用各不相同。

<!--核心库-->
<dependency>
	<groupId>cn.dev33</groupId>
	<artifactId>sa-token-spring-boot-starter</artifactId>
	<version>1.20.0</version>
</dependency>
<!--用Redis缓存授权信息-->
<dependency>
	<groupId>cn.dev33</groupId>
	<artifactId>sa-token-dao-redis</artifactId>
	<version>1.20.0</version>
</dependency>
<!--注解式权限验证-->
<dependency>
	<groupId>cn.dev33</groupId>
	<artifactId>sa-token-spring-aop</artifactId>
	<version>1.20.0</version>
</dependency>

修改配置文件,在application.yml文件中,定义Sa-Token的配置信息。

sa-token:
  #token名称 (同时也是cookie名称)
  token-name: token
  # token有效期,单位s 默认30天, -1代表永不过期
  timeout: 2592000
  # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
  activity-timeout: -1
  # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
  allow-concurrent-login: true
  # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
  is-share: false
  # token风格
  token-style: uuid

三、使用Sa-Token进行用户的角色和权限认证

在项目中使用了 Sa-Token 框架的注解来判断用户的角色和权限,首先需要编写一个类来获取用户的权限和角色信息。

在包中创建 StpInterfaceImpl 类,该类将实现 Sa-Token 框架的 StpInterface 接口。在该类中,我们需要声明两个方法,分别用于查询用户的实际权限和角色。

import cn.dev33.satoken.stp.StpInterface;
import org.springframework.stereotype.Component;

@Component
public class StpInterfaceImpl implements StpInterface {

    // 查询用户权限
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        // 根据 loginId 查询用户的权限信息,并返回权限列表
        List<String> permissionList = new ArrayList<>();
        // 查询用户权限的代码逻辑
        return permissionList;
    }

    // 查询用户角色
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        // 根据 loginId 查询用户的角色信息,并返回角色列表
        List<String> roleList = new ArrayList<>();
        // 查询用户角色的代码逻辑
        return roleList;
    }
}

在上述代码中,您需要根据具体的业务逻辑实现 getPermissionListgetRoleList 方法,查询用户的权限和角色信息,并将其返回为列表形式。一般是向Dao层发送请求,然后Dao层从数据库中获取。

要让 Sa-Token 框架来判断用户的角色和权限,我们可以使用 Sa-Token 提供的注解来实现。

首先,我们需要在我们的 Web 方法上使用 @SaCheckPermission 注解来判断用户是否具备某个权限。该注解用于拦截 HTTP 请求,并检查用户的权限是否匹配。示例如下:

@SaCheckPermission("ROOT, AMECT:INSERT")
@GetMapping("/example")
public String exampleMethod() {
    // 处理业务逻辑
    return "example";
}

在上述示例中,@SaCheckPermission 注解中的参数是一个权限字符串,表示用户需要具备的权限。在这个例子中,用户需要具备 “ROOT” 或 “AMECT:INSERT” 权限才能访问 exampleMethod 方法。

类似地,我们可以使用 @SaCheckRole 注解来判断用户是否具备某个角色。示例如下:

@SaCheckRole("ADMIN")
@GetMapping("/admin")
public String adminMethod() {
    // 处理业务逻辑
    return "admin";
}

在上述示例中,@SaCheckRole 注解中的参数是一个角色字符串,表示用户需要具备的角色。在这个例子中,用户需要具备 “ADMIN” 角色才能访问 adminMethod 方法。

当 Sa-Token 框架拦截到 HTTP 请求时,它会调用我们之前实现的 StpInterfaceImpl 类中的方法来获取用户的真实角色和权限信息,然后与注解中定义的角色和权限进行匹配。

通过使用 @SaCheckPermission@SaCheckRole 注解,我们能够简化权限和角色的判断逻辑,并确保只有具备特定权限和角色的用户可以访问受限资源。

四、Sa-Token进行会话管理

使用Sa-Token进行会话管理非常简单。Sa-Token提供了一套易于使用的API,使我们可以轻松地管理用户的会话信息。

首先,要创建或更新会话,您可以使用以下代码:

import cn.dev33.satoken.stp.StpUtil;

// 创建会话
StpUtil.login(userId);

// 更新会话
StpUtil.login(userId, tokenTimeout);

上述代码中,userId是用户的唯一标识符,可以是用户的ID、用户名或任何其他对用户进行唯一标识的值。tokenTimeout是可选参数,用于设置会话的过期时间(以秒为单位)。如果不指定tokenTimeout,则会话将使用默认的过期时间。

在会话创建或更新后,可以通过以下方式获取当前登录用户的会话信息:

import cn.dev33.satoken.stp.StpUtil;

// 获取当前登录用户ID
String userId = StpUtil.getLoginId();

// 检查当前用户是否已登录
boolean isLogin = StpUtil.isLogin();

要注销会话,您可以使用以下代码:

import cn.dev33.satoken.stp.StpUtil;

// 注销当前登录用户
StpUtil.logout();

通过上述代码,我们可以使用Sa-Token轻松地创建、更新、获取和注销用户的会话信息。此外,Sa-Token还提供了许多其他有用的API,如设置会话属性、获取会话的过期时间、获取会话剩余有效时间等。

我们在导入依赖的时候导入了Redis的依赖,sa-token-dao-redis是Sa-Token框架中与Redis集成的模块,它提供了一些实现类和方法,用于将Sa-Token的会话数据存储到Redis中。通过集成Redis,可以实现分布式环境下的会话管理和共享。

在项目中添加了cn.dev33.satoken-dao-redis的依赖后,就可以使用Sa-Token框架提供的Redis相关的功能,例如使用Redis存储会话数据、设置会话过期时间等。

<!--用Redis缓存授权信息-->
<dependency>
	<groupId>cn.dev33</groupId>
	<artifactId>sa-token-dao-redis</artifactId>
	<version>1.20.0</version>
</dependency>

Sa-Token 框架要求用户在登录成功后,在 Web 方法中执行 StpUtil.setLoginId(userId) 来设置登录用户的标识。然后,Sa-Token 框架会根据该用户标识自动生成一个 Token 令牌,并将其缓存到 Redis 中。接下来,将该 Token 以 Cookie 的形式存储到用户的浏览器中。

当用户在浏览器上提交请求时,请求会携带包含 Token 的 Cookie。此时,Sa-Token 框架会拦截请求,并检查 Cookie 中是否包含合法的 Token。它会将用户的 Token 与 Redis 中缓存的 Token 进行比对,以判断用户是否已经登录系统。

如果用户未登录系统(即 Token 无效或已过期),Sa-Token 框架会将请求重定向到登录页面,以保护系统的安全性。只有在登录成功并设置了有效的 Token 后,用户才能继续访问受保护的资源。

总的来说,Sa-Token 框架通过将 Token 缓存在 Redis 中,并使用 Cookie 在浏览器上存储 Token,实现了简单而安全的用户身份验证和会话管理。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abcccccccccccccccode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值