开发喵星球

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

1. 什么是Sa-Token

Sa-Token 是一个 java轻量级权限认证框架,专为前后端分离架构打造,主要解决登录认证、权限认证、单点登录、OAuth2、微服务网关鉴权等一系列权限相关问题。

Sa-TokenAPI 设计非常简单,对于APP用户来说,我们一般只需要进行登录认证操作即可。

本文主要介绍在若依框架中如何使用 Sa-Token 实现 APP 或小程序用户的登录功能。

2. 具体实现步骤

1 添加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,只需要将 sa-token-spring-boot-starter 修改为 sa-token-spring-boot3-starter 即可。

2 修改拦截器配置

位置:ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

// APP请求:不拦截APP或小程序发送过来的请求
.antMatchers("/api/**").permitAll()

3 添加Sa-Token配置

新增 SaTokenConfig.java,对APP小程序发送过来的请求进行拦截

位置:ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java

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/**")
                // 排除 APP或小程序的 认证授权请求,如登录等
                .excludePathPatterns("/api/auth/**");
    }
}

4 实现登录接口

位置:ruoyi-admin/src/main/java/com/ruoyi/web/api/AuthApi.java

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.*;

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

    @Autowired
    private ISysUserService userService;

    @PostMapping("/login")
    @ApiOperation("账号密码登录")
    public AjaxResult login(@RequestBody LoginBody loginBody) {
        AjaxResult ajax = AjaxResult.success();
        // 1. 根据用户名和密码进行认证
        SysUser user = userService.selectUserByUserName(loginBody.getUsername());
        if (user == null || !SecurityUtils.matchesPassword(loginBody.getPassword(), user.getPassword())) {
            return AjaxResult.error("用户名或密码错误");
        }

        // 2. 登录成功, 创建 Token
        StpUtil.login(user.getUserId());
        String tokenValue = StpUtil.getTokenValue();

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

5 添加用户会话管理

位置: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.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

    @Autowired
    private ISysUserService userService;

    @GetMapping("/info")
    @ApiOperation("获取用户信息")
    public AjaxResult info() {
        // 1. 获取当前登录用户的 ID
        long userId = StpUtil.getLoginIdAsLong();

        // 2. 根据用户 ID 查询用户信息
        SysUser user = userService.selectUserById(userId);

        // 3. 返回用户信息
        return AjaxResult.success(user);
    }

    @PostMapping("/logout")
    @ApiOperation("退出登录")
    public AjaxResult logout() {
        // 1. 获取当前登录用户的 Token
        String tokenValue = StpUtil.getTokenValue();

        // 2. 注销当前用户的登录状态
        StpUtil.logout(tokenValue);

        return AjaxResult.success();
    }
}

在需要权限控制的方法上,可以使用 Sa-Token 提供的注解进行鉴权。

到此若依集成权限框架Sa-Token已经完成。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-05-10 16:45:35 阅读量:238
<<   >>


powered by kaifamiao