认证鉴权
本项目采用轻量级 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 的认证。
@SaIgnore
@Operation(summary = "登录", description = "用户登录")
@PostMapping("/login")
public LoginResp login(@RequestBody @Valid LoginReq req, HttpServletRequest request) {
return authService.login(req, request);
}
鉴权
项目中主要使用两种权限校验方式:注解鉴权和 CRUD 默认鉴权。
注解鉴权
在 Controller 方法上添加 @SaCheckPermission
注解进行权限校验,该注解表示用户必须具有指定权限才能访问该方法。更多用法请查阅 SaToken 官方文档。
@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 统一添加了权限校验,无需在每个方法上单独添加校验注解。
/**
* 部门管理 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> {
}
在 BaseController
的 preHandle
方法中,系统会根据 Controller 的 API URL 和 API 类型自动生成权限码,例如:
- Controller API URL 为
/system/dept
- API 类型为
Api.CREATE
(对应新增操作) - 生成的权限码则为
system:dept:create
所以,当你创建新的 Controller 并继承 BaseController
时,请确保菜单权限配置遵循相同的规则,否则将校验失败。
忽略鉴权
和忽略认证一样,如果需要忽略鉴权,只需要在对应 Controller 类或 Controller 方法上添加 @SaIgnore
注解即可。将此注解放在类上,将忽略该 Controller 内所有 API 的鉴权;放在方法上,则仅忽略对应 API 的鉴权。
@SaIgnore
@Operation(summary = "登录", description = "用户登录")
@PostMapping("/login")
public LoginResp login(@RequestBody @Valid LoginReq req, HttpServletRequest request) {
return authService.login(req, request);
}
常见问题
如何为 CRUD Controller(继承了 BaseController)自定义权限校验规则?
- 全局修改:在
continew-common
中修改BaseController
的preHandle
方法 - 局部修改:在 Controller 中重写
preHandle
方法
参考资料
1.Sa-Token 权限认证:https://sa-token.cc/doc.html#/use/jur-auth