精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

岛国精品一区二区三区| 精品视频在线观看一区二区| 神马久久久久久久| 日韩中字在线| 欧美一级欧美一级在线播放| www.av毛片| 国产视频福利在线| 国产在线一区观看| 91爱视频在线| 国产亚洲精品久久久久久豆腐| 亚洲开心激情| 在线免费av一区| 中文一区一区三区免费| 欧美一级特黄aaaaaa大片在线观看| 亚洲在线网站| 日韩有码视频在线| 国产精品久久久免费观看| 亚洲电影有码| 亚洲3atv精品一区二区三区| 亚洲啪啪av| 神马午夜在线观看| 久久性色av| 欧美精品成人在线| 国产精品免费在线视频| 美女久久久久| 欧美成人精品1314www| 国产视频手机在线播放| 狠狠操一区二区三区| 中文字幕一区二区日韩精品绯色| 国产精品伊人日日| 国产一区二区波多野结衣| 国产精品日本欧美一区二区三区| 久久av.com| 国产精品无码无卡无需播放器| 精品人人人人| 日韩欧美你懂的| 亚洲国产成人va在线观看麻豆| 亚洲精品永久免费视频| 亚洲一区二区三区自拍| 亚洲一二三区精品| 国产福利在线观看| 99re热这里只有精品视频| 3d精品h动漫啪啪一区二区| 久久午夜鲁丝片| 亚洲专区欧美专区| 午夜精品美女自拍福到在线| 九九视频免费观看| 欧美黄色精品| 欧美成人一二三| 日本精品在线免费观看| 日韩影院二区| 中文字幕亚洲一区在线观看| 少妇无套高潮一二三区| 啪啪亚洲精品| 亚洲人成网站免费播放| 最新中文字幕视频| 亚洲欧洲免费| 亚洲精品久久久久久下一站 | 精品成人无码一区二区三区| 婷婷成人在线| 亚洲欧美成人网| 中国黄色a级片| 亚洲精品亚洲人成在线| 亚洲精品中文字幕女同| 国产人妻大战黑人20p| 国产精品一在线观看| 亚洲一级黄色av| 亚洲一级黄色录像| 91精品国产91久久久久久黑人| 久久激情视频久久| 青娱乐免费在线视频| 亚洲私人影院| 欧美性视频网站| 亚洲国产精品无码久久久| 日日摸夜夜添夜夜添精品视频 | 国产亚洲精品va在线观看| 男生草女生视频| 欧美丝袜丝交足nylons172| 深夜福利一区二区| 性欧美疯狂猛交69hd| 欧美91大片| 久久免费视频在线观看| 亚洲欧美一区二区三区在线观看| 日本怡春院一区二区| 91精品国产自产在线老师啪 | 日韩大片在线观看视频| 一卡二卡三卡四卡| 狠狠综合久久av一区二区蜜桃| 中文字幕精品网| 一区视频免费观看| 国产日本精品| 国产日韩精品综合网站| 亚洲高清在线观看视频| 久久久精品天堂| 婷婷视频在线播放| 蜜桃av在线播放| 欧美午夜精品久久久久久超碰| www.com久久久| 国产一级成人av| 亚洲最大中文字幕| 久操视频免费在线观看| 久久精品人人| 92国产精品视频| 日本一卡二卡四卡精品| 亚洲免费观看在线观看| 国产无套内射久久久国产| 国产一区二区三区亚洲综合 | 国产精选久久久久久| 国产刺激高潮av| 国产精品系列在线| 日韩视频免费播放| 亚洲香蕉久久| 亚洲天堂精品在线| 久久综合久久鬼| 免费成人av在线| 激情视频一区二区| caopeng在线| 欧美亚洲一区三区| 一级欧美一级日韩片| 亚洲激情中文| 国产精品伦子伦免费视频| 国产77777| 亚洲视频在线一区| 亚洲精品高清无码视频| 国产欧美一区二区三区米奇| 色婷婷综合成人| 亚洲 欧美 日韩 在线| 成人免费电影视频| 妞干网这里只有精品| 亚洲天堂1区| 亚洲视频综合网| 中文在线第一页| 成人黄色大片在线观看| 最近免费观看高清韩国日本大全| 亚洲www啪成人一区二区| 日韩久久午夜影院| 日本网站在线免费观看| 国产91丝袜在线18| 欧美精品久久96人妻无码| 99精品国自产在线| 亚洲午夜色婷婷在线| 国产精品自拍99| 成人白浆超碰人人人人| 妞干网在线播放| 久久伊人久久| 美女福利视频一区| 国产精品毛片一区视频播| 国产精品初高中害羞小美女文| 久久午夜夜伦鲁鲁一区二区| av在线亚洲色图| 色综合男人天堂| 亚洲精品久久久蜜桃动漫| 亚洲免费av高清| 91香蕉国产线在线观看| 中文字幕免费精品| 亚洲综合最新在线| 青草av在线| 精品国产三级电影在线观看| 国产成人无码精品久在线观看 | 欧美视频自拍偷拍| 欧美一区二区三区粗大| 久久精品99国产精品| 宅男av一区二区三区| 成人短视频软件网站大全app| 久久五月天综合| 亚洲成人一二三区| 婷婷久久综合九色国产成人| 极品粉嫩小仙女高潮喷水久久 | 中国黄色片免费看| 欧美高清视频手机在在线| 成人看片人aa| 欧美人与禽性xxxxx杂性| 亚洲成色www8888| 800av免费在线观看| 欧美激情一区二区三区四区 | 亚洲欧洲专区| 欧美激情视频三区| 天天干天天舔天天射| 色呦呦国产精品| 成人三级视频在线观看| 国产成人99久久亚洲综合精品| 亚洲色成人www永久在线观看| 欧美理伦片在线播放| 国产精品va在线| 国产精品实拍| 日韩av中文在线| 中文字幕在线2019| 亚洲一区二区三区四区在线| 精品夜夜澡人妻无码av | 女人扒开双腿让男人捅| 亚洲欧洲一区| 水蜜桃亚洲一二三四在线| 精品视频一二| 热久久美女精品天天吊色| 精品176二区| 日韩精品在线影院| 97视频免费在线| 五月天网站亚洲| 中文国语毛片高清视频| 99视频热这里只有精品免费| 少妇一级淫免费播放| 在线日本成人| 亚洲一区二区精品在线观看| 国产精品一线| 国产综合香蕉五月婷在线| 最新欧美色图| 欧美大学生性色视频| 丁香在线视频| 亚洲国产精品久久91精品| 在线观看免费高清视频| 天天综合网 天天综合色| 日韩三级在线观看视频| 91丨porny丨中文| 中文字幕1区2区| 日本成人中文字幕| 男人天堂1024| 欧美午夜影院| 中文精品一区二区三区| 国产一区二区三区四区二区| 国产精品入口免费| 2019中文亚洲字幕| 国产精品青青在线观看爽香蕉 | 精品人妻人人做人人爽夜夜爽| 日本一不卡视频| 免费国产黄色网址| 国产精品激情| 欧美爱爱视频网站| 日本a口亚洲| 久久综合福利| 欧美影院天天5g天天爽| yellow视频在线观看一区二区 | 欧美电影一区二区| 午夜一区二区三区四区| 午夜精品久久久久久久99樱桃 | 午夜国产精品视频| 一区二区三区观看| 成人同人动漫免费观看| 欧美高清视频一区二区三区在线观看| 九色丨蝌蚪丨成人| 国产精成人品localhost| 亚洲视频国产| 3d精品h动漫啪啪一区二区| 自拍偷拍欧美日韩| 91在线观看免费高清| 96视频在线观看欧美| 国产精品最新在线观看| 婷婷久久综合九色综合99蜜桃| 国产精品日日摸夜夜添夜夜av| 粉嫩一区二区三区| 国产精品91一区| 精品123区| 国产一区玩具在线观看| 亚洲福利影视| 亚洲在线第一页| 视频在线亚洲| 国产女人水真多18毛片18精品| 91午夜精品| 国产九色精品| 天天躁日日躁成人字幕aⅴ| 快播亚洲色图| 国产精品欧美在线观看| 午夜欧美性电影| 99精品在线观看| 免费cad大片在线观看| 最新成人av网站| 午夜精品久久久久久久无码| 久久久久国产精品一区三寸| 99草草国产熟女视频在线| 免费的成人av| 乳色吐息在线观看| 91浏览器在线视频| 黄色片网站免费| 亚洲欧美综合色| 久久成人国产精品入口| 精品久久久久久国产91| 无码人妻精品一区二区三区蜜桃91| 在线观看不卡一区| 国产一区二区在线播放视频| 欧美大片顶级少妇| 日本天堂影院在线视频| 日韩在线国产精品| 久久久123| 日韩免费在线免费观看| av成人在线网站| 国产伦一区二区三区色一情| 深爱激情综合网| 99精品一区二区三区的区别| 亚洲日本欧美| 中文字幕国内自拍| 福利电影一区二区| 公肉吊粗大爽色翁浪妇视频| 亚洲欧美经典视频| 四虎成人永久免费视频| 欧美美女一区二区在线观看| 色婷婷av一区二区三| 中文字幕久久精品| 2018av在线| 国产专区精品视频| 亚洲人成网www| 青草全福视在线| 日日嗨av一区二区三区四区| 美女被艹视频网站| 国产亚洲精品中文字幕| 精品无码m3u8在线观看| 欧美午夜不卡在线观看免费| 性生交大片免费看女人按摩| 国产一区二区三区视频在线观看 | 亚洲免费视频成人| 69亚洲精品久久久蜜桃小说| 日韩美女视频在线| fc2在线中文字幕| 欧美亚洲第一页| 久久久精品区| 亚洲午夜精品久久久中文影院av| 国产日韩欧美一区在线| 欧美一级大片免费看| 中国色在线观看另类| 天天干天天干天天| 亚洲国产精品高清久久久| 18视频在线观看| 国产精品看片资源| 国产真实有声精品录音| 久久精品视频16| 粉嫩av亚洲一区二区图片| www.黄色com| 欧美少妇xxx| 久久久久久久影视| 55夜色66夜色国产精品视频| 色妞ww精品视频7777| 91手机视频在线| 美女视频黄久久| 天天干天天舔天天操| 欧美性猛交xxxx免费看漫画| 亚洲 欧美 自拍偷拍| 久久久久国产精品一区| 日韩三级久久| 欧美一区二区三区综合| 国产乱人伦偷精品视频不卡| 免费成人美女女在线观看| 欧美亚一区二区| 国产福利在线| 欧美三级午夜理伦三级中文幕| 久久这里只有精品23| 国产高清久久久| www.5588.com毛片| 88在线观看91蜜桃国自产| 在线免费观看黄| 国产视频999| 天天综合精品| 美女被艹视频网站| 亚洲一区二区欧美日韩| 免费观看a视频| 69久久夜色精品国产69乱青草| 欧美18免费视频| 国产素人在线观看| 久久亚洲捆绑美女| 亚洲精品一区二三区| 中文字幕日韩在线视频| 欧美成人福利| 欧美 另类 交| 成人午夜在线视频| 国产精品500部| 亚洲天堂精品在线| 九九热这里有精品| 大桥未久一区二区三区| 高清不卡在线观看| 国产又爽又黄的视频| 不卡在线一区| 亚洲二区自拍| 国模无码大尺度一区二区三区| 国产精品免费人成网站酒店| 精品奇米国产一区二区三区| 男女羞羞在线观看| 日产精品高清视频免费| 国内精品伊人久久久久av影院| 黄色一级视频免费| 精品视频久久久久久久| 国产极品久久久久久久久波多结野| 伊人av成人| 懂色中文一区二区在线播放| 国产小视频在线免费观看| 在线观看精品自拍私拍| 久久伊人影院| 久草资源站在线观看| 亚洲欧洲色图综合| 午夜18视频在线观看| 国产精品国模在线| 欧美成人嫩草网站| 亚洲久久久久久久| 日韩午夜中文字幕| 男人最爱成人网| 欧洲金发美女大战黑人| 久久久久久久久久久黄色 | 最新av电影网站| 日韩精品一区二区三区中文不卡 | 欧美精品三区| 亚洲国产无码精品| 欧美成人性福生活免费看| 97人人做人人爽香蕉精品| 极品粉嫩国产18尤物|