为了账号安全,请及时绑定邮箱和手机立即绑定

Sa-Token实战:新手入门指南

标签:
Java 架构 安全
概述

本文将详细介绍如何使用Sa-Token进行用户认证、权限管理、实时会话以及Token生成与管理,帮助读者快速掌握Sa-Token实战技巧。Sa-Token是一款轻量级的Java权限认证工具包,适用于各种应用场景。我们将通过示例代码展示如何安装和使用Sa-Token,解决常见的权限认证问题。

Sa-Token简介与安装

Sa-Token的基本概念

Sa-Token 是一款用于权限认证的 Java 工具包,主要用于解决权限认证、会话管理等问题。它具有简单易用、轻量级、高性能等特点,适用于各种 Java 应用场景。

Sa-Token 的主要功能包括但不限于:

  • 用户认证与登录
  • 权限管理与角色分配
  • 实时会话与在线状态管理
  • Token 生成与管理

Sa-Token的安装方法

安装 Sa-Token 可以通过 Maven 或 Gradle 方式进行。以下是通过 Maven 进行安装的步骤:

  1. 在项目的 pom.xml 文件中添加 Sa-Token 的依赖:

    <dependency>
       <groupId>cn.dev33</groupId>
       <artifactId>sa-token</artifactId>
       <version>1.29.0</version>
    </dependency>
  2. 下载并引入 Sa-Token 的 jar 包:
    • 从官方仓库下载 Sa-Token 的 jar 包。
    • 将下载的 jar 包放入项目的 lib 目录中。
    • 在项目的 pom.xml 中配置相应的依赖,例如:
      <dependency>
       <groupId>cn.dev33</groupId>
       <artifactId>sa-token</artifactId>
       <version>1.29.0</version>
       <scope>system</scope>
       <systemPath>${project.basedir}/lib/sa-token-1.29.0.jar</systemPath>
      </dependency>
用户认证与登录

创建用户认证接口

为了实现用户认证,首先需要创建一个用户认证接口。该接口负责接收用户的登录请求,并验证用户的身份信息。

示例代码如下:

import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaCheckPermission;
import cn.dev33.sa.annotation.SaCheckRole;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AuthController extends BaseSaTokenController {

    @Autowired
    private SaTokenService saTokenService;

    @PostMapping("/login")
    public SaResult login(@RequestBody String data) {
        // 从请求中获取用户信息
        String username = getJson().getStr("username");
        String password = getJson().getStr("password");

        // 验证用户名和密码
        boolean result = validateUser(username, password);
        if (!result) {
            return SaResult.notPass("用户名或密码错误");
        }

        // 登录成功后生成 token
        String token = saTokenService.login(username, password);
        return SaResult.ok().put("token", token);
    }

    private boolean validateUser(String username, String password) {
        // 这里可以调用数据库或其他认证服务验证用户名和密码
        // 例如:
        // boolean isValid = userService.validateUser(username, password);
        boolean isValid = true; // 假设这里验证结果总是正确的
        return isValid;
    }
}
权限管理与角色分配

权限与角色的概念

权限管理是 Sa-Token 的核心功能之一。权限管理分为两种主要类型:

  1. 权限点:代表具体的权限,例如 create-postedit-post
  2. 角色:代表一组权限的集合,例如 admin 角色拥有 create-postedit-post 两个权限点。

实现权限管理与角色分配

要实现权限管理与角色分配,需要在用户登录后为其分配角色,并检查其是否具有特定权限。

示例代码如下:

import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaCheckPermission;
import cn.dev33.sa.annotation.SaCheckRole;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AuthController extends BaseSaTokenController {

    @Autowired
    private SaTokenService saTokenService;

    @PostMapping("/login")
    public SaResult login(@RequestBody String data) {
        // 从请求中获取用户信息
        String username = getJson().getStr("username");
        String password = getJson().getStr("password");

        // 验证用户名和密码
        boolean result = validateUser(username, password);
        if (!result) {
            return SaResult.notPass("用户名或密码错误");
        }

        // 登录成功后生成 token
        String token = saTokenService.login(username, password);
        return SaResult.ok().put("token", token);
    }

    @PostMapping("/grant-role")
    @SaLoginUser
    public SaResult grantRole(@SaLoginUser SaUser user, @RequestBody String data) {
        String role = getJson().getStr("role");
        if (saTokenService.grantRole(user.getId(), role)) {
            return SaResult.ok();
        }
        return SaResult.notPass();
    }

    @PostMapping("/check-permission")
    @SaLoginUser
    @SaCheckPermission("edit-post")
    public SaResult checkPermission() {
        return SaResult.ok();
    }

    private boolean validateUser(String username, String password) {
        // 验证用户名和密码
        boolean isValid = true; // 假设这里验证结果总是正确的
        return isValid;
    }
}
实时会话与在线状态管理

实时会话管理

Sa-Token 提供了实时会话管理功能,可以监控用户的登录状态。为了实现实时会话管理,可以使用 SaTokenService 中的 kickoutByUserNamekickoutBySessionId 方法。

示例代码如下:

import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SessionController extends BaseSaTokenController {

    @Autowired
    private SaTokenService saTokenService;

    @PostMapping("/kickout-user")
    public SaResult kickoutUser(@RequestBody String data) {
        String username = getJson().getStr("username");
        boolean result = saTokenService.kickoutByUserName(username);
        return SaResult.ok().put("result", result);
    }

    @PostMapping("/kickout-session")
    public SaResult kickoutSession(@RequestBody String data) {
        String sessionId = getJson().getStr("sessionId");
        boolean result = saTokenService.kickoutBySessionId(sessionId);
        return SaResult.ok().put("result", result);
    }
}

在线状态管理

Sa-Token 还提供了在线状态管理功能,可以帮助你管理用户的在线状态。为了实现在线状态管理,可以使用 SaTokenService 中的 setOnline 方法。

示例代码如下:

import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OnlineController extends BaseSaTokenController {

    @Autowired
    private SaTokenService saTokenService;

    @PostMapping("/set-online")
    @SaLoginUser
    public SaResult setOnline(@SaLoginUser SaUser user) {
        boolean result = saTokenService.setOnline(user.getId(), true);
        return SaResult.ok().put("result", result);
    }

    @PostMapping("/set-offline")
    @SaLoginUser
    public SaResult setOffline(@SaLoginUser SaUser user) {
        boolean result = saTokenService.setOnline(user.getId(), false);
        return SaResult.ok().put("result", result);
    }
}
Token生成与管理

Token的生成

在用户登录时,Sa-Token 会为用户生成一个 Token。这个 Token 是用户身份的唯一标识符,用于后续的权限验证。

示例代码如下:

import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.annotation.SaLogout;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TokenController extends BaseSaTokenController {

    @Autowired
    private SaTokenService saTokenService;

    @PostMapping("/login")
    public SaResult login(@RequestBody String data) {
        // 从请求中获取用户信息
        String username = getJson().getStr("username");
        String password = getJson().getStr("password");

        // 验证用户名和密码
        boolean result = validateUser(username, password);
        if (!result) {
            return SaResult.notPass("用户名或密码错误");
        }

        // 登录成功后生成 token
        String token = saTokenService.login(username, password);
        return SaResult.ok().put("token", token);
    }

    private boolean validateUser(String username, String password) {
        // 验证用户名和密码
        boolean isValid = true; // 假设这里验证结果总是正确的
        return isValid;
    }
}

Token的刷新与回收

Token 的刷新可以延长 Token 的有效期。Token 的回收可以强制用户重新登录。

示例代码如下:

import cn.dev33.sa.BaseSaTokenController;
import cn.dev33.sa.annotation.SaLoginUser;
import cn.dev33.sa.annotation.SaLogout;
import cn.dev33.sa.core.SaResult;
import cn.dev33.sa.model.SaUser;
import cn.dev33.sa.service.SaTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TokenController extends BaseSaTokenController {

    @Autowired
    private SaTokenService saTokenService;

    @PostMapping("/refresh-token")
    @SaLoginUser
    public SaResult refreshToken(@SaLoginUser SaUser user) {
        String token = saTokenService.renew(user.getId());
        return SaResult.ok().put("token", token);
    }

    @PostMapping("/logout")
    @SaLogout
    public SaResult logout(@SaLoginUser SaUser user) {
        saTokenService.logout(user.getId());
        return SaResult.ok();
    }
}
常见问题与解决方案

常见错误及解决方法

  1. Token 无效

    • 确认 Token 是否过期。
    • 检查 Token 的生成和验证过程是否正确。
    • 检查 Token 的配置是否正确。
  2. 权限验证失败

    • 确认用户是否具有相应的权限。
    • 检查权限点配置是否正确。
    • 检查角色分配是否正确。
  3. 用户会话问题
    • 确认会话是否已经过期。
    • 检查会话管理配置是否正确。
    • 检查会话相关的 API 是否正常工作。

使用Sa-Token的注意事项

  1. Token 安全性

    • Token 应该通过 HTTPS 进行传输,确保数据安全。
    • Token 应该妥善保存,避免泄露。
  2. 权限管理

    • 权限点和角色的配置应该清晰明了,便于维护和扩展。
    • 权限验证逻辑应该在代码中清晰地体现出来。
  3. 在线状态管理
    • 实时会话管理可以提高系统的安全性,但也需要合理配置,避免频繁的会话失效。
    • 在线状态管理可以提高用户体验,但需要合理配置,避免不必要的在线状态变化。

通过以上步骤,你可以快速地理解和使用 Sa-Token,构建一个安全、高效的权限认证系统。如果你在使用过程中遇到任何问题,可以参考官方文档或联系开发者获取支持。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消