开发喵星球

若依集成Sa-Token权限框架(347)

Sa-Token介绍

Sa-Token是一个轻量级的Java权限认证框架,专为前后端分离架构设计。它能够帮助开发者轻松实现登录认证、权限控制、单点登录、OAuth2、微服务网关鉴权等功能,特别适合多端应用的认证场景。本文将介绍如何在若依框架中集成Sa-Token,并实现APP或小程序用户的登录功能。

应用场景

在开发应用时,Sa-Token可以用来解决APP、小程序、Web端等多端统一的登录认证和权限控制需求。通过Sa-Token,开发者能够轻松应对不同终端的用户身份验证、会话管理和权限检查等操作,特别适合企业级应用和大规模用户系统。

注意事项

  1. 使用Sa-Token需要确保系统的Session管理是分布式存储,推荐使用Redis来存储用户Token等会话数据。
  2. 若使用SpringBoot 3.x,需要注意依赖版本的适配,修改依赖配置为sa-token-spring-boot3-starter
  3. 对于敏感接口,如用户登录、退出,需要单独处理认证拦截,避免影响整体系统的性能和安全性。

完整代码

第一步:引入Sa-Token依赖

ruoyi-common模块的pom.xml中添加以下依赖:

<!-- Sa-Token 权限认证 -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.30.0</version>
</dependency>

<!-- Sa-Token 整合 Redis -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-dao-redis-jackson</artifactId>
    <version>1.30.0</version>
</dependency>

如果项目使用的是SpringBoot 3.x版本,依赖项应替换为:

<artifactId>sa-token-spring-boot3-starter</artifactId>

第二步:修改安全拦截器配置

ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java中调整拦截器配置,放行特定的API接口:

// 对APP或小程序发送的请求不进行拦截
.antMatchers("/api/**").permitAll();

拦截器配置

第三步:配置Sa-Token

ruoyi-framework/src/main/java/com/ruoyi/framework/config/目录下新增SaTokenConfig.java,用于定义API接口的拦截策略:

SaToken配置文件

package com.ruoyi.framework.config;

import cn.dev33.satoken.interceptor.SaRouteInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册Sa-Token的路由拦截器
        registry.addInterceptor(new SaRouteInterceptor())
                // 拦截APP或小程序的所有请求
                .addPathPatterns("/api/**")
                // 排除登录认证请求
                .excludePathPatterns("/api/auth/**");
    }
}

第四步:实现登录接口

ruoyi-admin/src/main/java/com/ruoyi/web/api/目录下创建AuthApi.java文件,处理APP用户的登录请求:

AuthApi登录接口

package com.ruoyi.web.api;

import cn.dev33.satoken.stp.StpUtil;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.service.ISysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/auth")
@Api("APP用户授权认证API")
public class AuthApi {

    @Autowired
    private ISysUserService userService;

    @PostMapping("/login")
    @ApiOperation("登录")
    public AjaxResult login(@RequestBody LoginBody loginBody) {
        SysUser user = userService.selectUserByUserName(loginBody.getUsername());
        if (user == null || !SecurityUtils.matchesPassword(loginBody.getPassword(), user.getPassword())) {
            return AjaxResult.error("用户名或密码错误");
        }
        // 用户登录成功后,创建Token
        StpUtil.login(user.getUserId());
        String tokenValue = StpUtil.getTokenValue();

        // 返回Token信息
        return AjaxResult.success()
                .put(StpUtil.getTokenName(), tokenValue)
                .put("userId", user.getUserId());
    }
}

第五步:实现用户会话管理

ruoyi-admin/src/main/java/com/ruoyi/web/api/ums/目录下创建UmsUserApi.java,用于管理用户登录和退出操作:

用户会话管理

package com.ruoyi.web.api.ums;

import cn.dev33.satoken.stp.StpUtil;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.service.ISysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/user")
@Api("用户模块API")
public class UmsUserApi {

    @Autowired
    private ISysUserService userService;

    @GetMapping("/info")
    @ApiOperation("获取用户信息")
    public AjaxResult info() {
        long userId = StpUtil.getLoginIdAsLong();
        SysUser user = userService.selectUserById(userId);
        return AjaxResult.success(user);
    }

    @PostMapping("/logout")
    @ApiOperation("退出登录")
    public AjaxResult logout() {
        StpUtil.logout(StpUtil.getTokenValue());
        return AjaxResult.success();
    }
}

运行结果

通过上述步骤,若依系统中的用户认证流程已经集成了Sa-Token,实现了对APP用户的登录验证、Token管理、用户信息查询等功能。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-10-02 00:02:19 阅读量:161
<<   >>


powered by kaifamiao