溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于SpringBoot實現權限控制注解的示例分析

發布時間:2021-02-01 09:23:27 來源:億速云 閱讀:467 作者:小新 欄目:開發技術

小編給大家分享一下基于SpringBoot實現權限控制注解的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

 注解是 JDK 5.0 引入的一種注釋機制。注解可以作用在類型(類、接口、枚舉等)、屬性、方法、參數等不同位置,具體的 JDK 版本所支持的注解位置可參考 java.lang.annotation.ElementType 。此外還有注解的策略,也就是 RetentionPolicy ,這里不加贅述。

注解可以實現很多功能,其中最主要的就是進行代碼標注,所以有時候注解也叫做標注。使用起來也基本顧名思義,就是對代碼進行標注,簡化部分代碼的邏輯。

下面我們就著手實現一個簡單的權限控制注解,來對注解有一個基本的了解。

準備

@Permission 注解

注解本身的代碼很簡單。下面實現的是一個 @Permission 注解,為了方便使用,這里只提供一個屬性value,因為如果一個注解中有一個名稱為value的屬性,且你只想設置value屬性(即其他屬性都采用默認值或者你只有一個value屬性),那么可以省略掉“value=”部分。

import java.lang.annotation.*;

@Target({ElementType.PARAMETER}) // 注解可用于參數
@Retention(RetentionPolicy.RUNTIME) // 注解在運行時可由JVM讀入
@Documented
public @interface Permission {
  String value() default "";
}

User 類

一個簡單的User類,包含 permissions 用于保存用戶的權限。

import lombok.Data;

@Data
public class User {
  private String id;
  private String name;

  private Set<String> permissions;
}

UserService 類

簡單的 Service 類,用于判斷權限。

@Service
public class UserService {
  public boolean checkCreatePermission(@Permission("創建用戶") User user) {
    return true;
  }

  public boolean checkDeletePermission(@Permission("刪除用戶") User user) {
    return true;
  }
}

PermissionAspect 類

利用 SpringBoot 簡單地設置切面,獲取注解并使用。這里直接

@Aspect
@Component
public class PermissionAspect {
  // 需要修改為實際的 Service 所在的 Package
  @Pointcut("execution(public * tk.yubarimelon.MongoDemo.service.*.*(..))") 
  public void permissionCheck() {
  }

  @Around("permissionCheck()")
  public Object before(ProceedingJoinPoint joinPoint) throws Throwable {
    Object[] params = joinPoint.getArgs();
    // 獲取方法,此處可將signature強轉為MethodSignature
    MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    Method method = signature.getMethod();

    // 獲取參數注解,1維是參數,2維是注解
    Annotation[][] parameterAnnotations = method.getParameterAnnotations();
    for (int i = 0; i < parameterAnnotations.length; i++) {
      Object param = params[i];
      Annotation[] annotations = parameterAnnotations[i];
      if (!(param instanceof User) || annotations.length == 0) {
        continue;
      }
      for (Annotation annotation : annotations) {
        if (annotation.annotationType().equals(Permission.class)) {
          Permission permission = (Permission) annotation;
          User user = (User) param;
          if (CollectionUtils.isEmpty(user.getPermissions())) {
            log.error(user.getName() + " 無任何權限!");
            return false;
          }
          if (!StringUtils.hasLength(permission.value())) {
            log.error(joinPoint.getSignature().toString() + "權限設置異常");
            return false;
          }
          if (!user.getPermissions().contains(permission.value())) {
            log.error(joinPoint.getSignature().toString() +": "+user.getName() + " 無權限: " + permission.value());
            return false;
          }
          return joinPoint.proceed();
        }
      }
    }
    return joinPoint.proceed();
  }
}

ApplicationTests 類

簡單的測試類,用于測試代碼。這里簡單的配置一個用戶只有創建用戶的權限

@SpringBootTest
class ApplicationTests {

  @Autowired
  UserService userService;

  @Test
  void contextLoads() {
  }

  @Test
  void checkUser() {
    User user = new User();
    user.setName("小明");
    Set<String> permissions = new HashSet<>();
    permissions.add("創建用戶");
    user.setPermissions(permissions);

    System.out.println("checkCreatePermission " + userService.checkCreatePermission(user));
    System.out.println("checkDeletePermission " + userService.checkDeletePermission(user));
  }
}

輸出如下日志,證明權限設置起作用了。

checkCreatePermission true
2021-01-31 11:44:45.895 ERROR 12388 --- [           main] t.y.MongoDemo.aop.PermissionAspect       : boolean tk.yubarimelon.MongoDemo.service.UserService.checkDeletePermission(User): 小明 無權限: 刪除用戶
checkDeletePermission false

以上是“基于SpringBoot實現權限控制注解的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女