Skip to content

Verlif/permission-spring-boot-starter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 

Repository files navigation

Permission

接口权限控制
轻量级的访问权限控制,一个注解与一个接口即可完成权限控制。

本组件适用于以下项目:

  • 需要对不同的用户做不同的权限控制
  • 需要对接口做组合权限判定

不适用于以下项目(推荐使用 接口限制器 ):

  • 没有登录系统
  • 没有角色等访问者身份区分方式

注:完整注释请clone本项目

添加

Release

  1. 添加Jitpack仓库源

    maven

    <repositories>
       <repository>
           <id>jitpack.io</id>
           <url>https://jitpack.io</url>
       </repository>
    </repositories>
  2. 添加依赖

    maven

       <dependencies>
           <dependency>
               <groupId>com.github.Verlif</groupId>
               <artifactId>permission-spring-boot-starter</artifactId>
               <version>版本号</version>
           </dependency>
       </dependencies>
  3. 启用服务

    在任意配置类上使用@EnablePermission注解启用接口权限控制

使用

实现PermissionHandler接口(可选)

PermissionHandler是权限处理接口,用于对权限无法通过的处理。
内置的实现类会抛出NoPermDataExceptionNoPermissionException 异常,可以通过 全局异常处理 组件来处理这些异常, 也可以通过构造实现类来完成自定义逻辑。实现接口后,需要加上@Component来注入到Bean池,这样权限控制器才可以找到它。

public class DefaultPermissionHandler implements PermissionHandler {

   @Override
   public Object onNoPermData() {
      throw new NoPermDataException();
   }

   @Override
   public Object onNoPermission(PermData<?> data, Perm perm, Method method) {
      throw new NoPermissionException();
   }

}

实现PermissionDetector接口(必选

PermissionDetector是权限判定接口,是权限判定核心。内置的实现类实现了基础的权限判定,但未实现权限数据的获取。
开发者必须实现自己的判定实例。实现后与PermissionHandler相同,需要自定注入Bean池中。

public class DefaultPermissionDetector implements PermissionDetector<Object> {

   public DefaultPermissionDetector() {
   }

   /**
    * 权限数据是否拥有角色
    * @param data 权限数据,从下面的{@link #getRequestData()}获取的权限数据
    * @param role @Perm的hasRole参数
    * @return 权限数据是否拥有角色
    */
   @Override
   public boolean hasRole(PermData<Object> data, Object role) {
      return data.getRoles().stream().anyMatch(o -> o == role);
   }

   /**
    * 权限数据是否拥有权限
    * @param data 权限数据,从下面的{@link #getRequestData()}获取的权限数据
    * @param key @Perm的hasKey参数
    * @return 权限数据是否拥有权限
    */
   @Override
   public boolean hasKey(PermData<Object> data, String key) {
      return data.getKeys().stream().anyMatch(s -> s.equals(key));
   }

   /**
    * 主要实现以下方法,这个方法用于获取当前的访问者权限数据
    **/
   @Override
   public PermData<Object> getRequestData() {
      return null;
   }
}

PermData是一个权限数据接口。一般的应用场景是让项目中的User去实现这个接口,然后在上面的getRequestData() 方法中返回访问者的User对象。

用他!

@Perm注解用于API接口上或是Controller类上。

    /**
 * 获取个人信息时,需要登录用户
 */
@Perm(hasRole = "user")
@Operation(summary = "获取个人信息")
@GetMapping("/self")
public BaseResult<?> selfInfo(){
        return userBiz.getSelfInfo();
        }

配置

权限配置属性如下:

station:
   # 权限功能配置
   permission:
      # 权限功能是否开启
      enabled: true