欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談基于SpringBoot實(shí)現(xiàn)一個(gè)簡(jiǎn)單的權(quán)限控制注解

 更新時(shí)間:2021年01月31日 14:31:00   作者:ly931003  
這篇文章主要介紹了基于SpringBoot實(shí)現(xiàn)一個(gè)簡(jiǎn)單的權(quán)限控制注解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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

注解可以實(shí)現(xiàn)很多功能,其中最主要的就是進(jìn)行代碼標(biāo)注,所以有時(shí)候注解也叫做標(biāo)注。使用起來(lái)也基本顧名思義,就是對(duì)代碼進(jìn)行標(biāo)注,簡(jiǎn)化部分代碼的邏輯。

下面我們就著手實(shí)現(xiàn)一個(gè)簡(jiǎn)單的權(quán)限控制注解,來(lái)對(duì)注解有一個(gè)基本的了解。

準(zhǔn)備

@Permission 注解

注解本身的代碼很簡(jiǎn)單。下面實(shí)現(xiàn)的是一個(gè) @Permission 注解,為了方便使用,這里只提供一個(gè)屬性value,因?yàn)槿绻粋€(gè)注解中有一個(gè)名稱(chēng)為value的屬性,且你只想設(shè)置value屬性(即其他屬性都采用默認(rèn)值或者你只有一個(gè)value屬性),那么可以省略掉“value=”部分。

import java.lang.annotation.*;

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

User 類(lèi)

一個(gè)簡(jiǎn)單的User類(lèi),包含 permissions 用于保存用戶(hù)的權(quán)限。

import lombok.Data;

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

  private Set<String> permissions;
}

UserService 類(lèi)

簡(jiǎn)單的 Service 類(lèi),用于判斷權(quán)限。

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

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

PermissionAspect 類(lèi)

利用 SpringBoot 簡(jiǎn)單地設(shè)置切面,獲取注解并使用。這里直接

@Aspect
@Component
public class PermissionAspect {
  // 需要修改為實(shí)際的 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強(qiáng)轉(zhuǎn)為MethodSignature
    MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    Method method = signature.getMethod();

    // 獲取參數(shù)注解,1維是參數(shù),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() + " 無(wú)任何權(quán)限!");
            return false;
          }
          if (!StringUtils.hasLength(permission.value())) {
            log.error(joinPoint.getSignature().toString() + "權(quán)限設(shè)置異常");
            return false;
          }
          if (!user.getPermissions().contains(permission.value())) {
            log.error(joinPoint.getSignature().toString() +": "+user.getName() + " 無(wú)權(quán)限: " + permission.value());
            return false;
          }
          return joinPoint.proceed();
        }
      }
    }
    return joinPoint.proceed();
  }
}

ApplicationTests 類(lèi)

簡(jiǎn)單的測(cè)試類(lèi),用于測(cè)試代碼。這里簡(jiǎn)單的配置一個(gè)用戶(hù)只有創(chuàng)建用戶(hù)的權(quán)限

@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("創(chuàng)建用戶(hù)");
    user.setPermissions(permissions);

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

輸出如下日志,證明權(quán)限設(shè)置起作用了。

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): 小明 無(wú)權(quán)限: 刪除用戶(hù)
checkDeletePermission false

到此這篇關(guān)于淺談基于SpringBoot實(shí)現(xiàn)一個(gè)簡(jiǎn)單的權(quán)限控制注解的文章就介紹到這了,更多相關(guān)SpringBoot 權(quán)限控制注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合SpringSession實(shí)現(xiàn)分布式登錄詳情

    SpringBoot整合SpringSession實(shí)現(xiàn)分布式登錄詳情

    這篇文章主要介紹了SpringBoot整合SpringSession實(shí)現(xiàn)分布式登錄詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • IDEA連接MySQL后管理數(shù)據(jù)庫(kù)的操作指南

    IDEA連接MySQL后管理數(shù)據(jù)庫(kù)的操作指南

    本節(jié)就來(lái)教大家如何在IDEA連接MySQL后管理數(shù)據(jù)庫(kù)(創(chuàng)建/修改/刪除數(shù)據(jù)庫(kù)、創(chuàng)建/修改/刪除表、插入/更新/刪除/查詢(xún)表記錄),文中通過(guò)圖文結(jié)合的方式給大家講解的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Spring MVC異常處理機(jī)制示例詳解

    Spring MVC異常處理機(jī)制示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring MVC異常處理機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring MVC具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Java如何將ResultSet結(jié)果集遍歷到List中

    Java如何將ResultSet結(jié)果集遍歷到List中

    這篇文章主要介紹了Java如何將ResultSet結(jié)果集遍歷到List中問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 基于Nacos實(shí)現(xiàn)動(dòng)態(tài)線(xiàn)程池的設(shè)計(jì)與實(shí)踐分享

    基于Nacos實(shí)現(xiàn)動(dòng)態(tài)線(xiàn)程池的設(shè)計(jì)與實(shí)踐分享

    在分布式系統(tǒng)架構(gòu)中,線(xiàn)程池是資源調(diào)度的重要工具,傳統(tǒng)固定參數(shù)的線(xiàn)程池在流量平穩(wěn)的場(chǎng)景下表現(xiàn)良好,但面對(duì)現(xiàn)代互聯(lián)網(wǎng)業(yè)務(wù)的潮汐流量特征時(shí),往往會(huì)出現(xiàn)資源浪費(fèi)或處理能力不足的問(wèn)題,所以本文將介紹基于Nacos實(shí)現(xiàn)動(dòng)態(tài)線(xiàn)程池的設(shè)計(jì)與實(shí)踐,需要的朋友可以參考下
    2025-05-05
  • SpringBoot項(xiàng)目執(zhí)行腳本 自動(dòng)拉取最新代碼并重啟的實(shí)例內(nèi)容

    SpringBoot項(xiàng)目執(zhí)行腳本 自動(dòng)拉取最新代碼并重啟的實(shí)例內(nèi)容

    在本篇文章里小編給大家整理的是一篇關(guān)于SpringBoot項(xiàng)目執(zhí)行腳本 自動(dòng)拉取最新代碼并重啟的實(shí)例內(nèi)容,有需要的朋友們參考下。
    2019-12-12
  • SpringBoot啟動(dòng)時(shí)如何修改上下文

    SpringBoot啟動(dòng)時(shí)如何修改上下文

    本文介紹了如何在Spring Boot啟動(dòng)時(shí)修改上下文,以便加載封裝JAR中的國(guó)際化文件,通過(guò)在resources目錄下的META-INF文件夾中的spring.factories文件中配置指定類(lèi),可以實(shí)現(xiàn)這一功能
    2024-11-11
  • SpringBoot3中數(shù)據(jù)庫(kù)集成實(shí)踐詳解

    SpringBoot3中數(shù)據(jù)庫(kù)集成實(shí)踐詳解

    項(xiàng)目工程中,集成數(shù)據(jù)庫(kù)實(shí)現(xiàn)對(duì)數(shù)據(jù)的增曬改查管理,是最基礎(chǔ)的能力,所以下面小編就來(lái)和大家講講SpringBoot3如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)集成,需要的可以參考下
    2023-08-08
  • java反編譯工具jd-gui-osx?for?mac?M1芯片無(wú)法使用的問(wèn)題及解決

    java反編譯工具jd-gui-osx?for?mac?M1芯片無(wú)法使用的問(wèn)題及解決

    這篇文章主要介紹了java反編譯工具jd-gui-osx?for?mac?M1芯片無(wú)法使用的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Spring中的AOP動(dòng)態(tài)代理源碼詳解

    Spring中的AOP動(dòng)態(tài)代理源碼詳解

    這篇文章主要介紹了Spring中的AOP動(dòng)態(tài)代理源碼詳解,AOP即面向切面編程也稱(chēng)面向方面編程,它是面向?qū)ο缶幊蘋(píng)OP的一種補(bǔ)充,目前已成為一種比較成熟的編程方式,本文就其源碼進(jìn)行解析,需要的朋友可以參考下
    2023-09-09

最新評(píng)論