当前位置:   article > 正文

芋道框架的权限控制机制_芋道数据权限控制

芋道数据权限控制

芋道框架支持基本的权限控制机制,其技术层面,是通过SpringSecurity框架来实现的。

下面就从源代码代码中,分析一下芋道是如何做权限控制的。

拿岗位管理的代码示例来说。在文件PostController.java中,看如下代码:

  1. @GetMapping(value = "/get")
  2. @Operation(summary = "获得岗位信息")
  3. @Parameter(name = "id", description = "岗位编号", required = true, example = "1024")
  4. @PreAuthorize("@ss.hasPermission('system:post:query')")
  5. public CommonResult<PostRespVO> getPost(@RequestParam("id") Long id) {
  6. PostDO post = postService.getPost(id);
  7. return success(BeanUtils.toBean(post, PostRespVO.class));
  8. }

这段代码是用于查询岗位列表的。其中,注解@PreAuthorize("@ss.hasPermission('system:post:query')"),表明了,要想调用本方法,需要当前用户具有'system:post:query'权限。

那么,@PreAuthorize("@ss.hasPermission('system:post:query')")这段代码是如何被执行的呢?

答案位于文件YudaoSecurityAutoConfiguration.java中:

  1. @Bean("ss") // 使用 Spring Security 的缩写,方便使用
  2. public SecurityFrameworkService securityFrameworkService(PermissionApi permissionApi) {
  3. return new SecurityFrameworkServiceImpl(permissionApi);
  4. }

可以看到,名称为ss的Bean被注入进来。它是接口SecurityFrameworkService的实现。

而该接口的实现,位于SecurityFrameworkServiceImpl.java。

  1. @AllArgsConstructor
  2. public class SecurityFrameworkServiceImpl implements SecurityFrameworkService {
  3. private final PermissionApi permissionApi;
  4. @Override
  5. public boolean hasPermission(String permission) {
  6. return hasAnyPermissions(permission);
  7. }
  8. @Override
  9. public boolean hasAnyPermissions(String... permissions) {
  10. return permissionApi.hasAnyPermissions(getLoginUserId(), permissions);
  11. }
  12. @Override
  13. public boolean hasRole(String role) {
  14. return hasAnyRoles(role);
  15. }
  16. @Override
  17. public boolean hasAnyRoles(String... roles) {
  18. return permissionApi.hasAnyRoles(getLoginUserId(), roles);
  19. }
  20. @Override
  21. public boolean hasScope(String scope) {
  22. return hasAnyScopes(scope);
  23. }
  24. @Override
  25. public boolean hasAnyScopes(String... scope) {
  26. LoginUser user = SecurityFrameworkUtils.getLoginUser();
  27. if (user == null) {
  28. return false;
  29. }
  30. return CollUtil.containsAny(user.getScopes(), Arrays.asList(scope));
  31. }
  32. }

可以看到,其中有一个方法hasPermission,正是上文中提到的注解中的方法。

继续跟踪该方法的实现,最终会落在接口PermissionService的实现类PermissionServiceImpl上:

  1. @Override
  2. public boolean hasAnyPermissions(Long userId, String... permissions) {
  3. // 如果为空,说明已经有权限
  4. if (ArrayUtil.isEmpty(permissions)) {
  5. return true;
  6. }
  7. // 获得当前登录的角色。如果为空,说明没有权限
  8. List<RoleDO> roles = getEnableUserRoleListByUserIdFromCache(userId);
  9. if (CollUtil.isEmpty(roles)) {
  10. return false;
  11. }
  12. // 情况一:遍历判断每个权限,如果有一满足,说明有权限
  13. for (String permission : permissions) {
  14. if (hasAnyPermission(roles, permission)) {
  15. return true;
  16. }
  17. }
  18. // 情况二:如果是超管,也说明有权限
  19. return roleService.hasAnySuperAdmin(convertSet(roles, RoleDO::getId));
  20. }

该方法的操作就很明显了,就是通过查询数据库,来判断当前的用户是否拥有对应的权限。

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号