精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

通過Spring AOP結合SpEL表達式:構建強大且靈活的權限控制體系

開發 前端
通過本文的介紹,我們了解了如何使用Spring AOP和Spring Security的組合來實現權限驗證。通過這種方式,我們可以提高應用程序的安全性,并降低代碼的耦合度,提高代碼的可重用性和可維護性。希望本文能夠幫助讀者更好地理解和應用Spring AOP和Spring Security,為他們的應用程序開發提供有益的參考。

環境:SpringBoot2.7.12

1.前言

在當今的Web應用程序中,權限驗證是一個重要的安全措施,用于確保只有具有適當權限的用戶才能訪問特定的資源。隨著應用程序的規模和復雜性的增加,實現權限驗證變得更加困難。為了解決這個問題,我們可以使用Spring AOP(面向切面編程)和Spring Security的組合,它們可以提供一種有效的方法來實現權限驗證。

在本文中,我們將探討如何使用Spring AOP和Spring Security來實現權限驗證。我們首先介紹Spring AOP和Spring Security的概念,然后解釋如何將它們結合起來實現權限驗證。通過這種方式,我們可以確保只有具有適當權限的用戶能夠訪問受保護的資源,從而提高應用程序的安全性。

一、Spring AOP介紹


Spring AOP是Spring框架中的一個模塊,用于支持面向切面編程。它允許開發者在應用程序中的關鍵點定義切面,從而對程序流程進行干預和控制。通過使用AOP,我們可以將與業務邏輯無關的代碼(如日志記錄、事務管理、權限認證等)抽取出來,并將其放在獨立的切面中,這樣可以提高代碼的可重用性和可維護性。

二、Spring Security介紹


Spring Security是一個強大的安全框架,用于保護Web應用程序。它提供了豐富的安全特性,包括認證、授權、訪問控制等。通過使用Spring Security,我們可以輕松地實現用戶身份驗證、角色授權、URL級別的訪問控制等功能,從而確保只有經過授權的用戶才能訪問受保護的資源。

三、Spring AOP與Spring Security的組合


我們可以將Spring AOP與Spring Security結合起來實現權限驗證。具體步驟如下:

  1. 定義一個Aspect切面,用于實現權限驗證邏輯。該Aspect可以攔截用戶對受保護資源的訪問請求,并驗證其權限。
  2. 定義一個Filter,該過濾器實現token的解析,將權限信息保存到當前的安全上下文中,最后添加到Security的過濾器鏈中。
  3. 在Aspect中,我們可以使用Spring Security提供的API來獲取當前用戶的身份信息、角色等信息,并根據業務需求判斷用戶是否具有訪問受保護資源的權限。
  4. 如果用戶沒有足夠的權限訪問受保護資源,我們可以拋出一個異常,以阻止用戶繼續訪問。
  5. 如果用戶具有足夠的權限訪問受保護資源,我們可以允許用戶繼續訪問該資源。

通過這種方式,我們可以輕松地實現權限驗證,從而提高應用程序的安全性。同時,使用Spring AOP和Spring Security還可以降低代碼的耦合度,提高代碼的可重用性和可維護性。

2. 權限認證實現

相關依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>


<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.4.0</version>
</dependency>

權限認證過濾器

該過濾器的作用用來解析token,將權限信息添加到SecurityContext上下文中

public class PackAuthenticationFilter extends OncePerRequestFilter {


  public static final String TOKEN_NAME = "x-api-token" ;
  
  @SuppressWarnings("unused")
  private ApplicationContext context ;
  
  public PackAuthenticationFilter(ApplicationContext context) {
    this.context = context ;
  }
  
  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
      throws ServletException, IOException {
    String token = request.getHeader(TOKEN_NAME) ;
    if (!StringUtils.hasLength(token)) {
      response.setContentType("text/html;charset=UTF-8") ;
      response.getWriter().println("沒有權限訪問") ;
      return ;
    } 
    // 解析token
    List<? extends GrantedAuthority> authorities = JwtUtils.parseAuthority(token) ;
    Authentication authentication = new UsernamePasswordAuthenticationToken("", "", authorities) ;
    SecurityContextHolder.getContext().setAuthentication(authentication) ;
    filterChain.doFilter(request, response) ;
  }


}

安全配置類

將上面的過濾器添加到Security過濾器鏈中

@Configuration
public class SecurityConfig {
  
  @Autowired
  void setContext(ApplicationContext context) {
    this.context = context ;
  }
  @Bean
  public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.csrf().disable();
    // 對所有的資源全部放行,我們只做對Controller接口的限制訪問
    http.authorizeRequests().anyRequest().permitAll() ;
    // 添加過濾器
    http.addFilterBefore(new PackAuthenticationFilter(this.context), UsernamePasswordAuthenticationFilter.class) ;
    http.formLogin().disable() ;
    return http.build();
  }


}

自定義注解

該注解的作用用來標注具體的Controller接口。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PreAuthority {
  
  String value() default "" ;
  
}

驗證切面

該切面讀取接口配置的權限,驗證是否具有相應的權限

@Component
@Aspect
public class AuthenticationAspect {
  
  private AuthorityVerify authorityVerify ;
  
  public AuthenticationAspect(AuthorityVerify authorityVerify) {
    this.authorityVerify = authorityVerify ;
  }
  
  @Pointcut("@annotation(auth)")
  private void authority(PreAuthority auth) {}
  
  @Around("authority(auth)")
  public Object test(ProceedingJoinPoint pjp, PreAuthority auth) throws Throwable {
    String authority = auth.value() ;
    boolean permit = this.authorityVerify.hasAuthority(authority) ;
    if (!permit) {
      throw new RuntimeException("權限不足") ;
    }
    Object ret = pjp.proceed() ;
    return ret ;
  }
  
}

權限驗證工具類

@Component
public class AuthorityVerify {


  public boolean hasAuthority(String authority) {
    Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities() ;
    return authorities.contains(new SimpleGrantedAuthority(authority)) ;
  }
  
}

全局異常處理

在上面的切面類中,如果沒有權限是直接拋出的異常,所以這里定義一個全局異常對異常進行統一的處理。都比較簡單,理解即可。

@RestControllerAdvice
public class GlobalExceptionAdvice {
  
  @ExceptionHandler({Exception.class})
  public Object exceptionProcess(Exception e) {
    return e.getMessage() ;
  }
}

測試接口

@RestController
@RequestMapping("/api")
public class ApiController {


  @GetMapping("/save")
  @PreAuthority("api:save")
  public Object save(HttpServletResponse response) throws Exception {
    return "save method invoke..." ;
  }
  
  @GetMapping("/{id}")
  @PreAuthority("api:query")
  public Object query(@PathVariable("id") Integer id) {
    return "query method invoke..." ;
  }
  
}

測試用戶

Map<String, Object> map = new HashMap<>() ;
map.put("userId", "888888") ;
map.put("authorities", List.of("api:create", "api:query", "api:update", "api:delete")) ;
String token = createToken(map) ;
System.out.println(token) ;
String content = parseToken(token);
System.out.println(content) ;
System.out.println(">>>>>>>>>>>>>>>>>>>>>") ;
System.out.println(parseAuthority(token)) ;

這里模擬了一個用戶信息,設置了權限集合,通過這些信息生成JWT信息。如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI4ODg4ODgiLCJhdXRob3JpdGllcyI6WyJhcGk6Y3JlYXRlIiwiYXBpOnF1ZXJ5IiwiYXBpOnVwZGF0ZSIsImFwaTpkZWxldGUiXSwiZXhwIjoxNjk5NjE3NTM3fQ.GGLYIP2g5RZZkBoLnyQ_NWOQq_NUQylr5iZH9ouDiCM

測試結果

圖片圖片

/api/save接口配置的權限是api:save,實際模擬的用戶是沒有這個權限的,所以這里看到的是切面中拋出的異常信息。

圖片圖片

查詢接口正常訪問。

以上是簡單的示例,實際你應該會使用Spring Security結合數據庫一起來驗證管理用戶的。

通過本文的介紹,我們了解了如何使用Spring AOP和Spring Security的組合來實現權限驗證。通過這種方式,我們可以提高應用程序的安全性,并降低代碼的耦合度,提高代碼的可重用性和可維護性。希望本文能夠幫助讀者更好地理解和應用Spring AOP和Spring Security,為他們的應用程序開發提供有益的參考。

思考:

在上面的Controller中直接通過@PreAuthority('xxx')進行權限的設置,那我們是不是可以實現類似Spring Security提供@PreAuthorize("hasRole('xxx')")注解的功能,其中hasRole('xxx')是SpEL表達式。其實這里我們可以對切面稍加修改即可實現,部分代碼如下:

初始化SpEL上下文:

@PostConstruct
public void init() {
  SpelParserConfiguration config = new SpelParserConfiguration(true, true);
  parser = new SpelExpressionParser(config) ;
  context = new StandardEvaluationContext() ;
  context.setRootObject(this.authorityVerify) ;
}

修改切面

@Around("authority(auth)")
public Object test(ProceedingJoinPoint pjp, PreAuthority auth) throws Throwable {
  String authority = auth.value() ;
  boolean permit = this.parser.parseExpression(authority).getValue(this.context, Boolean.class) ;
  if (!permit) {
    throw new RuntimeException("不具備對應角色") ;
  }
  Object ret = pjp.proceed() ;
  return ret ;
}

修改接口

@GetMapping("/save")
@PreAuthority("hasRole({'ADMIN', 'MGR'})")
public Object save(HttpServletResponse response) throws Exception {
  return "save method invoke..." ;
}

該接口只要具有ADMIN或者MGR角色的都可以訪問。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2009-12-14 09:57:04

Lambda表達式

2024-09-06 10:05:47

SpELSpring權限

2019-03-13 08:56:07

JavaSpEL表達式注入

2023-08-01 23:04:40

Spring編程AOP

2011-06-01 13:31:29

Mercurial開放源碼

2023-10-10 08:16:07

Spring依賴注入SpEL表達式

2023-03-23 18:40:18

Lambda編程C++

2025-03-13 07:33:46

Spring項目開發

2024-03-01 08:51:01

Django查詢表達式查詢語句

2014-01-05 17:41:09

PostgreSQL表達式

2024-03-13 14:40:35

SpringCron表達式

2024-03-25 13:46:12

C#Lambda編程

2024-10-10 14:43:54

LambdaSpring編程

2018-09-27 15:25:08

正則表達式前端

2022-07-21 07:05:13

粒子動畫CSS

2009-08-31 16:39:32

ASP.NET表達式樹

2025-02-06 09:43:08

HybridFlowRay大語言模型

2023-06-12 15:06:58

2019-11-22 09:40:40

SpringJava編程語言

2022-09-08 11:35:45

Python表達式函數
點贊
收藏

51CTO技術棧公眾號

国产尤物久久久| 日本а中文在线天堂| 久久国产日韩欧美精品| 久久91超碰青草是什么| 亚州av综合色区无码一区| 欧洲一级精品| 亚洲激情图片qvod| 欧美三级网色| 亚洲国产欧美另类| 日本va欧美va欧美va精品| 久久99精品视频一区97| 91网站免费入口| 视频一区国产| 欧美这里有精品| 黄色一级在线视频| 好操啊在线观看免费视频| 91香蕉视频污在线| 99国产在线| 伊人影院中文字幕| 国产精品久久久亚洲一区| 久久久精品一区二区| 成人精品999| 国产另类在线| 日韩一区二区三| 欧美性猛交久久久乱大交小说 | 久久av综合网| 男人影院在线观看| 国产三级一区二区三区| 精品人伦一区二区三区| a天堂中文在线观看| 日韩不卡一二三区| 欧洲美女7788成人免费视频| 国产精品a成v人在线播放| 99精品视频在线| 一区二区三区亚洲| 97人妻精品一区二区免费| 国语一区二区三区| 欧美va亚洲va| 亚洲丝袜在线观看| 日韩激情综合| 正在播放亚洲一区| 一级日本黄色片| 亚洲成人毛片| 欧美理论片在线| www.久久av.com| 伊人亚洲精品| 911精品产国品一二三产区| 亚洲一级免费观看| 国产综合色区在线观看| 色婷婷亚洲一区二区三区| 欧美日韩一道本| 亚洲精华液一区二区三区| 精品成人久久av| 国产精品无码一区二区在线| 欧美极品videos大乳护士| 天天操天天干天天综合网| 久久久久久免费看| 欧美伦理91| 一本大道久久a久久综合婷婷| 国产精品亚洲αv天堂无码| 都市激情亚洲综合| 欧美在线观看视频一区二区| 国产又黄又猛又粗又爽的视频| av成人在线播放| 欧美日韩在线电影| xxxx在线免费观看| 视频在线观看免费影院欧美meiju 视频一区中文字幕精品 | 青青在线免费视频| 欧美aaa免费| 精品久久久久久亚洲国产300| 日本成人在线免费视频| jvid一区二区三区| 欧美精品1区2区3区| av在线天堂网| 一道在线中文一区二区三区| 一本色道久久88精品综合| 女人18毛片毛片毛片毛片区二 | 美国一区二区| 亚洲欧美中文日韩在线| 午夜精品久久久久99蜜桃最新版| 你懂的网址国产 欧美| 97碰在线观看| 中文字幕在线一| 国产精品亚洲视频| 久久综合一区二区三区| 日本在线播放| 亚洲va国产天堂va久久en| 日本熟妇人妻中出| 久久综合给合| 亚洲欧美日韩精品| 神马午夜精品91| 香蕉久久夜色精品国产| 91精品国产自产在线老师啪| 日韩在线视频观看免费| 国产日韩欧美综合在线| 国产高清www| a成人v在线| 亚洲精品国产美女| 久久中文免费视频| 亚洲欧美久久| 7777精品伊久久久大香线蕉语言| 久久国产精品高清一区二区三区| 伊人婷婷欧美激情| 久久久久久三级| 国产精品流白浆在线观看| 色99之美女主播在线视频| 99久在线精品99re8热| 国产在线国偷精品产拍免费yy| 免费久久99精品国产自| 日韩三级免费| 欧美日韩国产色站一区二区三区| yy6080午夜| 欧美成人日韩| 国产在线观看91精品一区| 经典三级在线| 精品国产乱码久久久久久天美| 在线免费看v片| 精品视频黄色| 5566成人精品视频免费| 国产成人手机在线| 亚洲人成网站在线| 欧美成人三级在线播放| 久久99国内| 久久久久久久国产精品视频| 国产高中女学生第一次| 亚洲欧洲国产专区| 91香蕉视频污版| 伊人久久大香线蕉综合网站| 国产做受高潮69| 成人毛片在线精品国产| 亚洲视频小说图片| 欧美性受xxxxxx黑人xyx性爽| 国产午夜一区| 欧美有码在线视频| 日韩专区第一页| 亚洲风情在线资源站| 成人在线观看一区二区| 这里只有精品在线| 成人午夜激情免费视频| 免费在线看a| 欧美理论片在线| 精品亚洲乱码一区二区| 久久国产三级精品| 一级黄色免费在线观看| 99久久这里有精品| 久久亚洲电影天堂| 国产视频在线观看视频| 成人欧美一区二区三区| 亚洲一二三不卡| 久久久久久久久久久久久久| 91高跟黑色丝袜呻吟在线观看| а√中文在线8| 日韩女优毛片在线| 福利一区二区三区四区| www.亚洲色图.com| 欧美三级一级片| 国产精品一区2区3区| 国产精品老牛影院在线观看 | 国内精品400部情侣激情| 亚洲欧美激情在线观看| 性做久久久久久久免费看| 黄色av网址在线观看| 亚洲欧美日韩视频二区| 日本视频一区二区不卡| 亚洲电影二区| 午夜精品99久久免费| 欧美美乳在线| 337p亚洲精品色噜噜| 国产乱国产乱老熟300| 成人国产精品免费网站| www.四虎成人| 亚洲精品在线观看91| 国产日韩欧美亚洲一区| 深夜成人影院| 久久影视电视剧免费网站清宫辞电视 | 亚洲 日韩 国产第一区| 精品国产不卡一区二区| 午夜精品久久久久久久男人的天堂 | 波多野结衣乳巨码无在线| 国内精品伊人久久久| 91久久夜色精品国产网站| 七七成人影院| 亚洲人成网7777777国产| 99久久免费国产精精品| 丰满岳妇乱一区二区三区| 天堂网av2018| 成av人片一区二区| 污色网站在线观看| 亚洲美女黄色| 亚洲一区免费看| 日韩在线麻豆| 91在线免费观看网站| 欧美aaaaa性bbbbb小妇| 欧美大尺度激情区在线播放| 黄色小视频在线免费观看| 日韩欧美激情一区| 日韩欧美国产另类| 亚洲国产综合人成综合网站| 91视频免费看片| 99热在这里有精品免费| 午夜影院免费版| 日本最新不卡在线| 久在线观看视频| 欧美成人日本| 一区二区三区四区国产| 小说区图片区色综合区| 999视频在线免费观看| 日韩高清成人| 91av中文字幕| 日韩av官网| www.国产精品一二区| 日韩二区三区| 亚洲第一二三四五区| 国产绳艺sm调教室论坛| 欧美自拍丝袜亚洲| 三级黄色在线视频| 亚洲综合色区另类av| 永久av免费网站| 中文字幕成人av| 3d动漫精品啪啪一区二区下载| 国产成人综合在线| 国产乱女淫av麻豆国产| 日本成人中文字幕在线视频| av动漫在线看| 亚洲每日在线| 激情五月宗合网| 欧美精品黄色| 亚洲av综合色区| 一级毛片免费高清中文字幕久久网| 色一情一乱一伦一区二区三区| 在线一级成人| 老牛影视免费一区二区| 婷婷综合成人| 久久精品午夜一区二区福利| 欧美日韩一区二区三区在线电影 | 天天干天天草天天射| 日韩精品在线看片z| www.xxx国产| 日韩视频免费观看高清完整版| 国产丝袜在线视频| 欧美一区二区在线播放| 91资源在线视频| 91精品久久久久久久久99蜜臂| 国产免费一区二区三区最新不卡| 欧美精品v日韩精品v韩国精品v| 一区二区三区精彩视频| 欧美日韩国产123区| 国产精品久久免费| 欧美一区二区网站| 亚洲精品久久久久久久久久| 精品奇米国产一区二区三区| 蜜桃在线一区二区| 日韩av一区在线| 亚洲av电影一区| 亚洲午夜色婷婷在线| 欧美私人网站| 欧美激情aaaa| 九色porny丨首页入口在线| 日本91av在线播放| 素人一区二区三区| 91久久精品国产91性色| 日本在线成人| 久久久久久艹| 日韩国产一区| 欧美黄网在线观看| av成人黄色| 午夜dv内射一区二区| 国产精品综合在线视频| 逼特逼视频在线观看| 久久久久久亚洲综合影院红桃| 337人体粉嫩噜噜噜| 一区二区三区在线播放| 91国产丝袜播放在线| 欧美三级三级三级爽爽爽| 国产特级黄色片| 日韩精品免费看| 色网站在线看| 78m国产成人精品视频| 激情小说亚洲| 久草一区二区| 婷婷久久一区| heyzo国产| 国产精品小仙女| 日韩精品无码一区二区三区久久久| 国产精品不卡在线| 日本中文字幕在线免费观看| 欧美丝袜丝交足nylons| 好吊色在线观看| 中文在线不卡视频| а_天堂中文在线| 国产精品永久免费视频| 都市激情亚洲| 亚洲欧美精品在线观看| 亚洲巨乳在线| 久久久精品视频国产| 久久久五月婷婷| 精品少妇一二三区| 欧美色精品在线视频| 神马午夜精品95| 另类少妇人与禽zozz0性伦| 成人性生活视频| 国产日产精品一区二区三区四区| 日韩欧美电影| 日本黄网站免费| eeuss国产一区二区三区 | 波多野结衣先锋影音| 亚洲欧美激情在线| 亚洲精品毛片一区二区三区| 亚洲变态欧美另类捆绑| 国产素人视频在线观看| 国产精品久久久久久久av大片| 精品自拍偷拍| 成人短视频在线观看免费| 蜜桃传媒麻豆第一区在线观看| 草草影院第一页| 午夜激情一区二区三区| 国产黄色美女视频| 久久精品视频免费播放| 91p九色成人| 久久国产主播精品| 韩国av一区| 中文字幕1区2区| 亚洲人成精品久久久久| 91九色蝌蚪91por成人| 亚洲视频专区在线| 香蕉久久免费电影| 欧美日韩精品久久久免费观看| 99在线精品视频在线观看| 午夜性福利视频| 亚洲精品乱码久久久久久日本蜜臀| 亚洲综合精品国产一区二区三区| 亚洲人成自拍网站| 日本久久免费| 欧美日本韩国在线| 麻豆精品网站| 欧美做受xxxxxⅹ性视频| 日韩欧美综合在线视频| 婷婷国产在线| 欧美亚洲在线观看| 自拍欧美一区| 久久久久久三级| 国产精品久久一卡二卡| 中文字幕在线网址| 久久人人爽人人爽爽久久| 中文幕av一区二区三区佐山爱| 制服国产精品| 国产专区欧美精品| 免费在线黄色片| 欧美精品一卡二卡| 欧美1234区| 精品一区二区三区自拍图片区| 国产亚洲毛片在线| 精品人伦一区二区三电影| 在线精品观看国产| 暖暖日本在线观看| 成人一区二区三区四区| 一区二区福利| www.日本高清视频| 91麻豆精品国产91久久久资源速度| 91福利国产在线观看菠萝蜜| 高清国产在线一区| 国产农村妇女精品一二区| 性猛交ⅹxxx富婆video | 天天影视涩香欲综合网 | 亚洲黄页网站| 亚洲欧美国产中文| 一区二区三区精品在线| 午夜成人免费影院| 国产精品美女久久| 日韩免费看片| 日本五十肥熟交尾| 欧美专区在线观看一区| 色女人在线视频| 欧美lavv| 激情欧美日韩一区二区| 日韩大片免费在线观看| 国产亚洲精品美女久久久| 日本一区二区乱| av片中文字幕| 亚洲精品国产无天堂网2021| 日本v片在线免费观看| 国产在线日韩在线| 日韩午夜高潮| 日本 欧美 国产| 日韩精品免费综合视频在线播放| 日韩成人精品一区二区三区| 日韩中字在线观看| 国产精品每日更新在线播放网址| 亚洲欧美另类视频| 国产精品激情av在线播放| 国内精品久久久久久久影视麻豆| 国产又粗又长又爽| 欧美一区二区三区免费| 欧美片第一页| 久久在线中文字幕| 国产精品国产精品国产专区不片| 五月天婷婷视频| 91丨九色丨国产在线| 石原莉奈一区二区三区在线观看| 欧美黄色免费看|