侧边栏壁纸
博主头像
博客技术 博主等级

行动起来,活在当下

  • 累计撰写 42 篇文章
  • 累计创建 4 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

Sa-Token 轻量级 Java 权限认证框架

Administrator
2025-02-16 / 0 评论 / 0 点赞 / 13 阅读 / 0 字

先上连接:Sa-Token

Sa-Token 是一个轻量级 Java 权限认证框架,专注于 登录认证权限认证Session会话 等核心功能。以下是其核心功能及在文章发布场景中

一、核心功能概览

  1. 登录认证

    • 支持账号密码登录、第三方登录、无状态登录等

    • 提供记住我(Remember Me)功能

    • 多端登录控制(如:允许/禁止同账号多地登录)

  2. 权限认证

    • 角色验证 (@SaCheckRole("admin"))

    • 权限验证 (@SaCheckPermission("article:add"))

    • 支持多维度权限校验(AND/OR逻辑)

  3. 会话管理

    • 分布式 Session 管理

    • 临时 Token、Token 续期、强制下线

    • 活跃监控(查询在线用户)

  4. 安全防护

    • 防止重复登录、账号封禁

    • 密码加密、防 CSRF 攻击

    • 自动续签 Token 有效期

  5. 集成扩展

    • 支持 Redis 集成(分布式环境)

    • 单点登录(SSO)、OAuth2.0

    • 与 Spring Boot、WebFlux、Solon 等框架无缝整合


二、发布文章场景下的使用步骤

假设你的系统需要实现:用户登录后,拥有 article:add 权限的用户才能发布文章

1. 引入依赖

<!-- Spring Boot 环境 -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.37.0</version>
</dependency>

2. 配置 Sa-Token

# application.yml
sa-token:
  token-name: satoken  # Token名称
  timeout: 86400       # Token有效期(秒),默认30分钟
  is-concurrent: true  # 允许并发登录
  is-share: false      # 禁止共享Token(每个端独立登录)

3. 用户登录

@PostMapping("/login")
public String login(String username, String password) {
    // 1. 校验用户名密码(此处模拟)
    if (!"zhang".equals(username) || !"123456".equals(password)) {
        return "登录失败";
    }
    
    // 2. 登录并分配权限(实际应从数据库查询权限)
    StpUtil.login(10001);
    StpUtil.getSession().set("user", getUserDetails(username));
    StpUtil.getSession().setPermissionList(Arrays.asList("article:add", "article:edit"));
    
    return "登录成功,Token:" + StpUtil.getTokenValue();
}

4. 权限校验(发布文章接口)

@SaCheckPermission("article:add")
@PostMapping("/article/publish")
public JsonResult publishArticle(@RequestBody Article article) {
    // 获取当前用户ID
    long userId = StpUtil.getLoginIdAsLong();
    
    // 业务逻辑:保存文章
    articleService.saveArticle(userId, article);
    
    return JsonResult.ok("发布成功");
}

5. 路由拦截(可选)

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截需要登录的接口
        registry.addInterceptor(new SaInterceptor(handle -> {
            StpUtil.checkLogin();
        })).addPathPatterns("/article/**");
    }
}

三、核心 API 速查

方法

说明

StpUtil.login(id)

用户登录

StpUtil.logout()

注销当前会话

StpUtil.isLogin()

检查是否已登录

StpUtil.getLoginId()

获取当前登录用户ID

StpUtil.checkPermission("x")

校验当前用户是否拥有某权限

StpUtil.kickout(id)

强制指定用户下线


四、高级功能扩展

1. 记住我(Remember Me)

// 登录时设置(第二个参数为是否持久化)
StpUtil.login(10001, true);

2. 角色校验

@SaCheckRole("writer")  // 要求用户拥有 writer 角色
@PostMapping("/article/draft")
public JsonResult saveDraft(...) { ... }

3. 动态权限(从数据库加载)

// 自定义权限验证逻辑
@SaCheckPermission(
    value = {"article:add", "article:edit"}, 
    mode = SaMode.CUSTOM, 
    type = PermissionType.CUSTOM
)
public JsonResult customCheck() { ... }

4. 分布式会话(集成 Redis)

sa-token:
  is-share: true       # 开启共享会话
  token-prefix: "tkn:" # Redis key前缀
  # 配置 Redis 连接(以 Jedis 为例)
  jedis:
    host: 127.0.0.1
    port: 6379

五、最佳实践建议

  1. 权限设计
    使用 资源:操作 格式(如 article:delete)细化权限颗粒度。

  2. 异常处理
    通过全局拦截器捕获 NotLoginExceptionNotPermissionException 返回统一错误码。

  3. 会话管理
    定期清理无效 Token:StpUtil.searchSession(pageSize, callback)

  4. 安全加固
    敏感操作(如删除文章)建议二次验证密码。

0

评论区