sa-token 之权限验证

权限验证

核心思想

所谓权限验证,验证的核心就是当前账号是否拥有一个权限码
有:就让你通过、没有:那么禁止访问
再往底了说,就是每个账号都会拥有一个权限码集合,我来验证这个集合中是否包括我需要检测的那个权限码
例如:当前账号拥有权限码集合:[“user:add”, “user:delete”, “user:get”],这时候我去验证权限码:“user:update”,则结果就是验证失败,禁止访问
所以现在问题的核心就是:

  1. 如何获取一个账号所拥有的的权限码集合
  2. 本次操作要验证的权限码是哪个

获取当前账号权限码集合

因为每个项目的需求不同,其权限设计也千变万化,【获取当前账号权限码集合】这一操作不可能内置到框架中, 所以sa-token将此操作以接口的方式暴露给你,以方便的你根据自己的业务逻辑进行重写

  • 你需要做的就是新建一个类,重写StpInterface接口,例如以下代码:
package com.pj.satoken;

import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import cn.dev33.satoken.stp.StpInterface;

/**
 *    自定义权限验证接口扩展 
 */
@Component    // 保证此类被springboot扫描,完成sa-token的自定义权限验证扩展 
public class StpInterfaceImpl implements StpInterface {

    /**
     * 返回一个账号所拥有的权限码集合 
     */
    @Override
    public List<String> getPermissionCodeList(Object loginId, String loginKey) {
        // 本list仅做模拟,实际项目中要根据具体业务逻辑来查询权限
        List<String> list = new ArrayList<String>();    
        list.add("101");
        list.add("user-add");
        list.add("user-delete");
        list.add("user-update");
        list.add("user-get");
        list.add("article-get");
        return list;
    }

    /**
     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginKey) {
        // 本list仅做模拟,实际项目中要根据具体业务逻辑来查询角色
        List<String> list = new ArrayList<String>();    
        list.add("admin");
        list.add("super-admin");
        return list;
    }

}

验证是否包含指定权限码

然后就可以用以下api来鉴权了

StpUtil.hasPermission(Object pcode)
- 查询当前账号是否含有指定权限,返回true或false

StpUtil.checkPermission(Object pcode)
- 检测当前账号是否含有指定权限,如果有则安全通过,如果没有则抛出异常:NotPermissionException
- 扩展:NotPermissionException 对象可通过 getLoginKey() 方法获取具体是哪个 StpLogic 抛出的异常

StpUtil.checkPermissionAnd(Object... pcode)
检测当前账号是否含有指定权限【指定多个,必须全都有,否则抛出异常】

StpUtil.checkPermissionOr(Object... pcode)
-检测当前账号是否含有指定权限【指定多个,有一个就可以了,全都没有才会抛出异常】

拦截全局异常

有同学要问,鉴权失败,抛出异常,然后呢?要把异常显示给用户看吗?
当然不能把异常抛给用户看,你可以创建一个全局异常拦截器,统一返回给前端的格式,例如以下示例:

写在最后

源码开源,作者不易,如果你喜欢这个框架麻烦你随手点一颗小星星哦!

在这里插入图片描述

### 如何使用 Sa-Token 实现权限控制 #### 1. 引入依赖 为了开始使用 Sa-Token,首先需要在项目中引入其 Maven 或 Gradle 依赖。以下是 Maven 配置示例: ```xml <dependency> <groupId>cn.dev33</groupId> <artifactId>sso-starter-spring-boot2</artifactId> <version>1.28.0</version> </dependency> ``` 此部分操作用于初始化项目的环境设置[^1]。 #### 2. 基本配置 完成依赖引入后,在 Spring Boot 的 `application.yml` 文件中可以进行基础配置,例如 Token 超时时间、Session 类型等参数设定。默认情况下,Sa-Token 提供了多种存储策略(内存、Redis),开发者可以根据需求灵活调整。 ```yaml sa-token: timeout: 2592000 # token有效期,默认单位秒(30天) is-concurrent: false # 是否允许同一账号并发登录 max-concurrency: -1 # 同一账号最大并发数 (is-concurrent=true时有效),-1表示不限制 ``` 上述配置项定义了令牌的有效期以及账户的并发行为约束。 #### 3. 登录功能实现 通过调用 Sa-Token 提供的方法来完成用户的登录逻辑。下面展示了一个简单的登录接口代码片段: ```java @RestController public class LoginController { @PostMapping("/doLogin") public String doLogin(String username, String password) { // 这里通常会查询数据库验证用户名密码是否匹配... boolean loginSuccess = "testUser".equals(username) && "123456".equals(password); if(loginSuccess){ StpUtil.login(10001); // 模拟登录成功后的用户ID设为10001 return "登录成功"; }else{ return "用户名或密码错误"; } } } ``` 在此处实现了基于模拟数据的身份验证过程,并利用 `StpUtil.login()` 方法记录已登录状态。 #### 4. 权限校验机制 对于特定资源访问前需执行权限检查的情况,可借助注解快速达成目标。比如只允许具有某些角色或者指定权限码的人才能进入某方法内部运行如下所示的例子: ```java @SneakyThrows @RequestMapping("/adminOnly") public String adminPage(){ StpUtil.checkRole("admin"); // 如果当前登录者不具备 'admin' 角色,则抛出异常 return "这是管理员页面"; } @RequestMapping("/viewReport") public String viewReport(){ StpUtil.checkPermission("report:view"); // 若无 report:view 权限时阻止继续 return "报告查看页"; } ``` 这里展示了两种不同类型的授权检测——按角色(`checkRole`) 和按具体动作许可 (`checkPermission`)。 #### 5. 自定义过滤器与拦截规则 除了直接应用内置注解外,还可以创建自定义 Filter 对请求路径加以管控。例如针对 `/api/**` 下的所有API端点统一加入身份验证环节: ```java @Configuration public class SaTokenConfigure implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SaTokenInterceptor()) .addPathPatterns("/api/**") // 应用到 /api/** 所有请求上 .excludePathPatterns("/api/login");// 排除掉无需认证的部分链接 } } ``` 这段脚本设置了全局性的安全防护措施,确保只有经过合法鉴权之后才可以触及受保护的内容。 --- ### 总结 以上介绍了关于如何采用 Sa-Token 构建一套完整的权限管理体系的关键步骤,涵盖了从初步准备直到实际部署使用的整个流程说明。希望这些指导能够帮助您更好地理解和运用该工具库解决日常开发中的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值