Skip to content

功能权限

本项目权限认证方案采用的是轻量级 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));
}

BaseControllercheckPermission 方法中,会根据对应 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