注解鉴权 —— 优雅的将鉴权与业务代码分离。本篇我们将介绍在 Sa-Token 中如何通过注解完成权限校验。
Sa-Token 是一个轻量级 java 权限认证框架,主要解决登录认证、权限认证、单点登录、OAuth2、微服务网关鉴权 等一系列权限相关问题。
Gitee 开源地址:https://gitee.com/dromara/sa-token
原文链接:https://blog.csdn.net/shengzhang_/article/details/130681908
@SaCheckPermission(“system:user:list”)
权限校验 —— 必须具有指定权限才能进入该方法。
首先在项目中引入 Sa-Token 依赖:
<!-- Sa-Token 权限认证 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.34.0</version>
</dependency>
注:如果你使用的是 SpringBoot 3.x,只需要将 sa-token-spring-boot-starter 修改为 sa-token-spring-boot3-starter 即可。
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
// 注册 Sa-Token 拦截器,打开注解式鉴权功能
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册 Sa-Token 拦截器,打开注解式鉴权功能
registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
}
}
保证此类被springboot启动类扫描到即可。
三、权限认证 & 角色认证
首先我们需要实现 StpInterface 接口,告诉框架指定账号拥有哪些权限码。
/**
* 自定义权限认证接口扩展,Sa-Token 将从此实现类获取每个账号拥有的权限码
*
* @author kong
* @since 2022-10-13
*/
@Component // 打开此注解,保证此类被springboot扫描,即可完成sa-token的自定义权限验证扩展
public class StpInterfaceImpl implements StpInterface {
/**
* 返回一个账号所拥有的权限码集合
*/
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
// 本list仅做模拟,实际项目中要根据具体业务逻辑来查询权限
List<String> list = new ArrayList<String>();
list.add("101");
list.add("user.add");
list.add("user.update");
list.add("user.get");
// list.add("user.delete");
list.add("art.*");
return list;
}
/**
* 返回一个账号所拥有的角色标识集合
*/
@Override
public List<String> getRoleList(Object loginId, String loginType) {
// 本list仅做模拟,实际项目中要根据具体业务逻辑来查询角色
List<String> list = new ArrayList<String>();
list.add("admin");
list.add("super-admin");
return list;
}
}
使用以下两个注解完成校验:
@SaCheckPermission(“user.add”):校验当前会话是否具有某个权限。
@SaCheckRole(“super-admin”):校验当前会话是否具有某个角色。
/**
* Sa-Token 注解鉴权示例
*
* @author kong
* @since 2022-10-13
*/
@RestController
@RequestMapping("/at-check/")
public class AtCheckController {
/*
* 前提1:首先调用登录接口进行登录
* ---- http://localhost:8081/doLogin?name=zhang&pwd=123456
*
* 前提2:项目在配置类中注册拦截器 SaInterceptor ,此拦截器将打开注解鉴权功能
*
* 前提3:项目实现了 StpInterface 接口,此接口会告诉框架指定账号拥有哪些权限码
*
* 然后我们就可以使用以下示例中的代码进行注解鉴权了
*/
// 权限校验 ---- http://localhost:8081/at-check/checkPermission
// 只有具有 user.add 权限的账号才可以进入方法
@SaCheckPermission("user.add")
@RequestMapping("checkPermission")
public SaResult checkPermission() {
// ...
return SaResult.ok();
}
// 角色校验 ---- http://localhost:8081/at-check/checkRole
// 只有具有 super-admin 角色的账号才可以进入方法
@SaCheckRole("super-admin")
@RequestMapping("checkRole")
public SaResult checkRole() {
// ...
return SaResult.ok();
}
}
可根据代码注释提供的链接进行测试访问。