功能权限
本项目权限认证方案采用的是轻量级 Java 权限认证框架 Sa-Token
。
1、获取当前登录用户的权限码和角色信息
java
// continew-admin-system/.../auth/config/satoken/SaTokenPermissionImpl
public class SaTokenPermissionImpl implements StpInterface {
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
LoginUser loginUser = LoginHelper.getLoginUser();
return new ArrayList<>(loginUser.getPermissions());
}
@Override
public List<String> getRoleList(Object loginId, String loginType) {
LoginUser loginUser = LoginHelper.getLoginUser();
return new ArrayList<>(loginUser.getRoleCodes());
}
}
2、使用 Sa-Token
提供的 API 或注解进行权限校验。
2.1 注解方式
在指定接口方法上方添加鉴权注解,本项目目前仅使用了 @SaCheckPermission
(必须具有指定权限才能进入该方法)。
java
// e.g. continew-admin-webapi/.../system/UserController#resetPassword
@SaCheckPermission("system:user:resetPwd")
2.2 API 方式
在本项目中,凡是由 BaseController
提供的 API 方法,都没有再显示单独添加权限校验,这是因为在 BaseController
内已经为这些 API 方法添加了权限校验。
// e.g. continew-admin-webapi/.../system/DeptController
@Tag(name = "部门管理 API")
@RestController
@CrudRequestMapping(value = "/system/dept", api = {Api.TREE, Api.GET, Api.ADD, Api.UPDATE, Api.DELETE, Api.EXPORT})
public class DeptController extends BaseController<DeptService, DeptResp, DeptResp, DeptQuery, DeptReq> {
}
java
// BaseController#add
@PostMapping
public R<Long> add(@Validated(ValidateGroup.Crud.Add.class) @RequestBody C req) {
this.checkPermission(Api.ADD);
return R.ok("新增成功", baseService.add(req));
}
在 BaseController
的 checkPermission
方法中,会根据对应 Controller 的 API URL + API 类型自动生成一个权限码来进行校验,例如:DeptController 的 API URL 为 /system/dept
, 对应的 add
API 类型产生的权限码则为 system:dept:add
。
所以,如果你新编写的功能 Controller 使用了 BaseController
提供的 API 方法,注意配置菜单权限时要保持规则一致。
当然了,你可根据个人需要重写 BaseController
中的 checkPermission
方法,以实现某个功能 Controller 的特殊权限处理。
参考资料
1.Sa-Token 权限认证:https://sa-token.cc/doc.html#/use/jur-auth