赞
踩
Sa-Token是一个功能强大且易于使用的由Java编写的国产权限认证和会话管理框架。它提供了一套简单而灵活的API,可以帮助开发人员轻松地实现身份验证、权限控制和会话管理的功能。
以下是Sa-Token框架的主要特点和功能:
简单易用:Sa-Token提供了简洁而直观的API,使得权限认证和会话管理变得简单易懂。开发人员可以快速集成和使用该框架,无需花费太多时间和精力。
多种登录验证方式:Sa-Token支持多种登录验证方式,包括基于Session的Cookie验证、基于Token的无状态验证、基于URL参数的验证等。这样,开发人员可以根据项目需求选择适合的验证方式。
细粒度的权限控制:Sa-Token提供了细粒度的权限控制机制,可以通过注解或编程方式进行配置。您可以轻松定义角色、权限和资源,并在代码中进行权限检查,确保只有具备相应权限的用户可以访问受保护的资源。
会话管理和单点登录:Sa-Token支持会话管理和单点登录功能,可以轻松处理用户的登录状态和会话信息。开发人员可以管理会话的生命周期、设置会话属性、注销会话等操作,并确保用户在多个系统之间实现无缝的单点登录。
集成简便:Sa-Token可以与各种常见的Java框架无缝集成,包括Spring Boot、Spring MVC、Spring Security等。无论您使用哪个框架,都可以轻松地将Sa-Token集成到您的项目中,并与其他框架或库进行配合使用。
丰富的扩展功能:Sa-Token提供了丰富的扩展功能,例如IP黑白名单、自定义过滤器、自定义注解等。这些扩展功能可以帮助开发人员满足更多特定需求,并提供更加灵活和定制化的权限认证和会话管理解决方案。
总而言之,Sa-Token是一个功能强大、易于使用且灵活的Java权限认证和会话管理框架。它可以帮助开发人员快速实现身份验证、权限控制和会话管理的功能,并提供了丰富的扩展功能以满足各种需求。
在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 框架的注解来判断用户的角色和权限,首先需要编写一个类来获取用户的权限和角色信息。
在包中创建 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; } }
在上述代码中,您需要根据具体的业务逻辑实现 getPermissionList
和 getRoleList
方法,查询用户的权限和角色信息,并将其返回为列表形式。一般是向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提供了一套易于使用的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,实现了简单而安全的用户身份验证和会话管理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。