Skip to content

认证鉴权

最后更新: 17 小时前
实践版本: v4.0.0

本项目采用轻量级 Java 权限认证框架 Sa-Token 实现完整的权限认证方案。Sa-Token 提供了简洁易用的 API,支持多种权限认证方式,满足项目的安全需求。

Sa-Token

Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。

配置说明

本项目依赖:ContiNew Starter continew-starter-auth-satoken,其提供了 SaToken 框架的轻量扩展优化,详情请查阅 starter 对应文档。

  • 预设 SaToken 部分样板化配置
  • 自定义 SaToken 持久层 Redisson 实现
  • 提供 SaToken 默认放行路径配置

本项目的 SaToken 核心配置主要集中在 continew-server/.../config/satoken 包下。

认证

忽略认证

如果需要忽略认证,只需要在对应 Controller 类或 Controller 方法上添加 @SaIgnore 注解即可。将此注解放在类上,将忽略该 Controller 内所有 API 的认证;放在方法上,则仅忽略对应 API 的认证。

java
@SaIgnore
@Operation(summary = "登录", description = "用户登录")
@PostMapping("/login")
public LoginResp login(@RequestBody @Valid LoginReq req, HttpServletRequest request) {
    return authService.login(req, request);
}

鉴权

项目中主要使用两种权限校验方式:注解鉴权和 CRUD 默认鉴权。

注解鉴权

在 Controller 方法上添加 @SaCheckPermission 注解进行权限校验,该注解表示用户必须具有指定权限才能访问该方法。更多用法请查阅 SaToken 官方文档

java
@SaCheckPermission("system:role:updatePermission")
@Operation(summary = "修改权限", description = "修改角色的功能权限")
@PutMapping("/{id}/permission")
public void updatePermission(@PathVariable("id") Long id, @RequestBody @Valid RoleUpdatePermissionReq req) {
    baseService.updatePermission(id, req);
}

CRUD 默认鉴权

对于继承了 top.continew.admin.common.base.controller.BaseController 的 Controller,项目为 CRUD API 统一添加了权限校验,无需在每个方法上单独添加校验注解。

DeptController.java
java
/**
 * 部门管理 API
 *
 * @author Charles7c
 * @since 2023/1/22 17:50
 */
@Tag(name = "部门管理 API")
@RestController
@CrudRequestMapping(value = "/system/dept", api = {Api.TREE, Api.GET, Api.CREATE, Api.UPDATE, Api.BATCH_DELETE,
    Api.EXPORT, Api.DICT_TREE})
public class DeptController extends BaseController<DeptService, DeptResp, DeptResp, DeptQuery, DeptReq> {
}

BaseControllerpreHandle 方法中,系统会根据 Controller 的 API URL 和 API 类型自动生成权限码,例如:

  • Controller API URL 为 /system/dept
  • API 类型为 Api.CREATE(对应新增操作)
  • 生成的权限码则为 system:dept:create

所以,当你创建新的 Controller 并继承 BaseController 时,请确保菜单权限配置遵循相同的规则,否则将校验失败。

忽略鉴权

和忽略认证一样,如果需要忽略鉴权,只需要在对应 Controller 类或 Controller 方法上添加 @SaIgnore 注解即可。将此注解放在类上,将忽略该 Controller 内所有 API 的鉴权;放在方法上,则仅忽略对应 API 的鉴权。

java
@SaIgnore
@Operation(summary = "登录", description = "用户登录")
@PostMapping("/login")
public LoginResp login(@RequestBody @Valid LoginReq req, HttpServletRequest request) {
    return authService.login(req, request);
}

常见问题

如何为 CRUD Controller(继承了 BaseController)自定义权限校验规则?
  1. 全局修改:在 continew-common 中修改 BaseController preHandle 方法
  2. 局部修改:在 Controller 中重写 preHandle 方法

参考资料

1.Sa-Token 权限认证:https://sa-token.cc/doc.html#/use/jur-auth