Sa-Token使用教程

在我们做后台管理系统的时候,认证授权是必不可少的功能!我们经常会选择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
<think>好的,我现在需要帮助用户解决如何将sa-token与Spring Security集成的教程问题。首先,我需要了解这两个框架各自的作用和集成可能遇到的挑战。 sa-token是一个轻量级的Java权限认证框架,主要用于会话管理和权限控制。而Spring Security是一个功能更为全面的安全框架,提供身份验证、授权、攻击防护等功能。用户可能希望结合两者的优势,比如使用sa-token的简洁API和Spring Security的安全性。 接下来,我需要确认现有的参考资料。用户提供的引用[1]提到了在Spring Boot中配置Redis来管理会话,这可能与会话存储有关,但引用[2]似乎不相关。因此,主要参考引用[1]中的Redis配置部分。 用户需要的是集成教程,所以步骤要详细。首先,添加依赖是关键,必须确保sa-token和Spring Security的依赖兼容。然后,配置Spring Security来允许sa-token处理部分安全逻辑,比如自定义过滤器或覆盖默认的登录流程。 可能的问题包括依赖冲突、配置错误以及如何分工处理认证和授权。需要建议用户检查依赖版本,并确保Spring Security的配置不会覆盖sa-token的功能。此外,自定义UserDetailsService可以结合sa-token的会话管理,确保用户信息正确加载。 最后,生成相关问题时,要考虑用户可能进一步的需求,比如权限管理、会话共享或分布式系统的扩展问题。这些都需要在回答中覆盖,帮助用户全面了解集成后的应用场景和优化方法。</think>### 将 Sa-Token 与 Spring Security 集成的步骤 #### 1. **添加依赖** 在 `pom.xml` 中引入 Sa-Token 和 Spring Security 的依赖: ```xml <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>1.34.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` #### 2. **配置 Redis 会话存储(可选)** 若需分布式会话管理,参考引用[1]在 `application.yml` 中配置 Redis: ```yaml spring: redis: host: localhost port: 6379 sa-token: data-source: cache: redis ``` #### 3. **自定义 Spring Security 配置** 覆盖 `WebSecurityConfigurerAdapter` 以整合 Sa-Token: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() // 使用 Sa-Token 的过滤器替代默认的登录/注销逻辑 .addFilterBefore(new SaTokenFilter(), UsernamePasswordAuthenticationFilter.class) .csrf().disable(); } // 自定义用户详情服务(与 Sa-Token 结合) @Bean public UserDetailsService userDetailsService() { return username -> { // 从数据库或缓存加载用户信息(需结合 Sa-Token 的 StpUtil) return User.withUsername(username) .password("{noop}password") .roles("USER") .build(); }; } } ``` #### 4. **实现 Sa-Token 过滤器** 创建过滤器处理登录认证与权限校验: ```java public class SaTokenFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { // 从请求中获取 Token 并验证 String token = StpUtil.getTokenValue(); if (StpUtil.isLogin()) { // 已登录时,将用户信息绑定到 Spring Security 上下文 SecurityContextHolder.getContext().setAuthentication( new UsernamePasswordAuthenticationToken(StpUtil.getLoginId(), null, getAuthorities()) ); } chain.doFilter(request, response); } private Collection<? extends GrantedAuthority> getAuthorities() { // 从 Sa-Token 中获取角色/权限列表并转换为 Spring Security 的 GrantedAuthority return StpUtil.getRoleList().stream() .map(role -> new SimpleGrantedAuthority("ROLE_" + role)) .collect(Collectors.toList()); } } ``` #### 5. **控制器层示例** ```java @RestController public class AuthController { @PostMapping("/login") public String login(@RequestParam String username, @RequestParam String password) { // 1. Spring Security 的身份验证 Authentication auth = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(username, password) ); SecurityContextHolder.getContext().setAuthentication(auth); // 2. Sa-Token 的登录操作 StpUtil.login(username); return "Login success. Token: " + StpUtil.getTokenValue(); } @GetMapping("/user/info") public String userInfo() { // 同时支持 Sa-Token 和 Spring Security 的权限校验 StpUtil.checkLogin(); return "User: " + StpUtil.getLoginId(); } } ``` --- ### **关键集成点说明** 1. **职责划分** - Spring Security 负责底层身份验证(如密码加密验证)和请求拦截 - Sa-Token 负责会话管理(Token 生成、续期)和细粒度权限控制 2. **会话同步** 通过自定义过滤器将 Sa-Token 的登录状态同步到 Spring Security 的 `SecurityContextHolder`,反之可通过监听 Spring Security 的登录事件触发 Sa-Token 的 `StpUtil.login()` 3. **配置注意事项** - 若需禁用 Spring Security 的默认登录页,添加 `http.formLogin().disable()` - Sa-Token 的注解 `@SaCheckLogin` 和 Spring Security 的 `@PreAuthorize` 可混合使用 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值