亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring Security其它權(quán)限校驗方式&自定義權(quán)限校驗方式

 更新時間:2024年08月22日 08:52:44   作者:Maiko Star  
這篇文章主要介紹了Spring Security其它權(quán)限校驗方式&自定義權(quán)限校驗方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、其它權(quán)限校驗方法(了解)

我們前面都是使用@PreAuthorize注解,然后在在其中使用的是hasAuthority方法進行校驗。

SpringSecurity還為我們提供了其它方法例如:hasAnyAuthority,hasRole,hasAnyRole等。

這里我們先不急著去介紹這些方法,我們先去理解hasAuthority的原理,然后再去學(xué)習(xí)其他方法你就更容易理解,而不是死記硬背區(qū)別。并且我們也可以選擇定義校驗方法,實現(xiàn)我們自己的校驗邏輯。

hasAuthority方法實際是執(zhí)行到了SecurityExpressionRoot的hasAuthority,大家只要斷點調(diào)試既可知道它內(nèi)部的校驗原理。

它內(nèi)部其實是調(diào)用authentication的getAuthorities方法獲取用戶的權(quán)限列表。然后判斷我們在接口上定義的權(quán)限是否被包含于用戶的權(quán)限列表,如果有則返回true放行,反之false攔截。

hasAnyAuthority方法可以傳入多個權(quán)限,只有用戶有其中任意一個權(quán)限都可以訪問對應(yīng)資源。

@PreAuthorize("hasAnyAuthority('admin','test','system:dept:list')")
public String hello(){
      return "hello";
}

hasRole要求有對應(yīng)的角色才可以訪問,但是它內(nèi)部會把我們傳入的參數(shù)拼接上 ROLE_ 后再去比較。

所以這種情況下要用用戶對應(yīng)的權(quán)限也要有 ROLE_ 這個前綴才可以。

@PreAuthorize("hasRole('system:dept:list')")
public String hello(){
    return "hello";
}

hasAnyRole 有任意的角色就可以訪問。它內(nèi)部也會把我們傳入的參數(shù)拼接上 ROLE_ 后再去比較。

所以這種情況下要用用戶對應(yīng)的權(quán)限也要有 ROLE_ 這個前綴才可以。

@PreAuthorize("hasAnyRole('admin','system:dept:list')")
public String hello(){
    return "hello";
}

二、自定義權(quán)限校驗方法(掌握)

我們也可以定義自己的權(quán)限校驗方法,在@PreAuthorize注解中使用我們的方法。

@Component("ex")
public class SGExpressionRoot {
    public boolean hasAuthority(String authority) {
        //獲取當前用戶的權(quán)限
        Authentication authentication =
                SecurityContextHolder.getContext().getAuthentication();
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        List<String> permissions = loginUser.getPermissions();
        //判斷用戶權(quán)限集合中是否存在authority
        return permissions.contains(authority);
    }
}

在SPEL表達式中使用 @ex相當于獲取容器中bean的名字未ex的對象。然后再調(diào)用這個對象的

hasAuthority方法

@RequestMapping("/hello")
@PreAuthorize("@ex.hasAuthority('system:dept:list')")
public String hello(){
    return "hello";
}

三、基于配置的權(quán)限控制

我們也可以在配置類中使用使用配置的方式對資源進行權(quán)限控制。

eg:

.antMatchers("/testCors").hasAuthority("system:dept:list222")
 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
//關(guān)閉csrf
                .csrf().disable()
//不通過Session獲取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
// 對于登錄接口 允許匿名訪問
                .antMatchers("/user/login").anonymous()
                .antMatchers("/testCors").hasAuthority("system:dept:list222")
// 除上面外的所有請求全部需要鑒權(quán)認證
                .anyRequest().authenticated();
//添加過濾器
        http.addFilterBefore(jwtAuthenticationTokenFilter,
                UsernamePasswordAuthenticationFilter.class);
//配置異常處理器
        http.exceptionHandling()
//配置認證失敗處理器
                .authenticationEntryPoint(authenticationEntryPoint)
                .accessDeniedHandler(accessDeniedHandler);
//允許跨域
        http.cors();
    }

四、CSRF

CSRF是指跨站請求偽造(Cross-site request forgery),是web常見的攻擊之一。

SpringSecurity去防止CSRF攻擊的方式就是通過csrf_token。后端會生成一個csrf_token,前端發(fā)起請求的時候需要攜帶這個csrf_token,后端會有過濾器進行校驗,如果沒有攜帶或者是偽造的就不允許訪問。

我們可以發(fā)現(xiàn)CSRF攻擊依靠的是cookie中所攜帶的認證信息。但是在前后端分離的項目中我們的認證信息其實是token,而token并不是存儲中cookie中,并且需要前端代碼去把token設(shè)置到請求頭中才可以,所以CSRF攻擊也就不用擔心了。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vert-x-通過異步的方式使用JDBC連接SQL

    Vert-x-通過異步的方式使用JDBC連接SQL

    在這篇文章中,我們將會看到怎樣在vert.x應(yīng)用中使用HSQL,當然也可以使用任意JDBC,以及使用vertx-jdbc-client提供的異步的API,這篇文章的代碼在github
    2016-01-01
  • SpringBoot參數(shù)校驗Validator框架詳解

    SpringBoot參數(shù)校驗Validator框架詳解

    Validator框架就是為了解決開發(fā)人員在開發(fā)的時候少寫代碼,提升開發(fā)效率,Validator專門用來進行接口參數(shù)校驗,今天通過本文給大家介紹SpringBoot參數(shù)校驗Validator框架,感興趣的朋友一起看看吧
    2022-06-06
  • Spring定時任務(wù)注解@Scheduled詳解

    Spring定時任務(wù)注解@Scheduled詳解

    這篇文章主要介紹了Spring定時任務(wù)注解@Scheduled詳解,@Scheduled注解是包org.springframework.scheduling.annotation中的一個注解,主要是用來開啟定時任務(wù),本文提供了部分實現(xiàn)代碼與思路,需要的朋友可以參考下
    2023-09-09
  • java  ThreadPoolExecutor使用方法簡單介紹

    java ThreadPoolExecutor使用方法簡單介紹

    這篇文章主要介紹了java ThreadPoolExecutor使用方法簡單介紹的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • SpringBoot實現(xiàn)動態(tài)多線程并發(fā)定時任務(wù)

    SpringBoot實現(xiàn)動態(tài)多線程并發(fā)定時任務(wù)

    這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)動態(tài)多線程并發(fā)定時任務(wù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Java多線程學(xué)習(xí)筆記

    Java多線程學(xué)習(xí)筆記

    常用的實現(xiàn)多線程的兩種方式:Thread和Runnable。之所以說是“常用”,是因為在Java 5后可以通過java.util.concurrent包中的線程池來實現(xiàn)多線程
    2021-09-09
  • 基于Springboot實現(xiàn)定時發(fā)送郵件功能

    基于Springboot實現(xiàn)定時發(fā)送郵件功能

    這篇文章主要為大家詳細介紹了基于Springboot實現(xiàn)定時發(fā)送郵件功能的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java基礎(chǔ)之內(nèi)部類與代理知識總結(jié)

    Java基礎(chǔ)之內(nèi)部類與代理知識總結(jié)

    今天帶大家復(fù)習(xí)Java的基礎(chǔ)知識,文中有非常詳細的介紹及圖文示例,對正在學(xué)習(xí)Java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • 詳解Java線程池的使用及工作原理

    詳解Java線程池的使用及工作原理

    在日常開發(fā)過程中總是以單線程的思維去編碼,沒有考慮到在多線程狀態(tài)下的運行狀況.由此引發(fā)的結(jié)果就是請求過多,應(yīng)用無法響應(yīng).為了解決請求過多的問題,又衍生出了線程池的概念.本文記錄了Java中線程池的使用及工作原理,需要的朋友可以參考下
    2021-05-05
  • java 中HashCode重復(fù)的可能性

    java 中HashCode重復(fù)的可能性

    這篇文章主要介紹了java 中HashCode重復(fù)的可能性的相關(guān)資料,這里提供實例及測試代碼,需要的朋友可以參考下
    2017-07-07

最新評論