您好,登錄后才能下訂單哦!
本篇文章為大家展示了Spring Security中的四種權限控制方式分別是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
Spring Security 中對于權限控制默認已經提供了很多了,但是,一個優秀的框架必須具備良好的擴展性,恰好,Spring Security 的擴展性就非常棒,我們既可以使用 Spring Security 提供的方式做授權,也可以自定義授權邏輯。一句話,你想怎么玩都可以!
今天來和大家介紹一下 Spring Security 中四種常見的權限控制方式。
表達式控制 URL 路徑權限
表達式控制方法權限
使用過濾注解
動態權限
四種方式,我們分別來看。
1.表達式控制 URL 路徑權限
首先我們來看第一種,就是通過表達式控制 URL 路徑權限,這種方式松哥在之前的文章中實際上和大家講過,這里我們再來稍微復習一下。
Spring Security 支持在 URL 和方法權限控制時使用 SpEL 表達式,如果表達式返回值為 true 則表示需要對應的權限,否則表示不需要對應的權限。提供表達式的類是 SecurityExpressionRoot:
可以看到,SecurityExpressionRoot 有兩個實現類,表示在應對 URL 權限控制和應對方法權限控制時,分別對 SpEL 所做的拓展,例如在基于 URL 路徑做權限控制時,增加了 hasIpAddress 選項。
我們來看下 SecurityExpressionRoot 類中定義的最基本的 SpEL 有哪些:
可以看到,這些都是該類對應的表達式,這些表達式我來給大家稍微解釋下:
這是最基本的,在它的繼承類中,還有做一些拓展,我這個我就不重復介紹了。
如果是通過 URL 進行權限控制,那么我們只需要按照如下方式配置即可:
protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("admin") .antMatchers("/user/**").hasAnyRole("admin", "user") .anyRequest().authenticated() .and() ... }
這里表示訪問 /admin/** 格式的路徑需要 admin 角色,訪問/user/** 格式的路徑需要 admin 或者 user 角色。
2.表達式控制方法權限
當然,我們也可以通過在方法上添加注解來控制權限。
在方法上添加注解控制權限,需要我們首先開啟注解的使用,在 Spring Security 配置類上添加如下內容:
@Configuration @EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { ... ... }
這個配置開啟了三個注解,分別是:
@PreAuthorize:方法執行前進行權限檢查
@PostAuthorize:方法執行后進行權限檢查
@Secured:類似于 @PreAuthorize
這三個結合 SpEL 之后,用法非常靈活,這里和大家稍微分享幾個 Demo。
@Service public class HelloService { @PreAuthorize("principal.username.equals('javaboy')") public String hello() { return "hello"; } @PreAuthorize("hasRole('admin')") public String admin() { return "admin"; } @Secured({"ROLE_user"}) public String user() { return "user"; } @PreAuthorize("#age>98") public String getAge(Integer age) { return String.valueOf(age); } }
鴻蒙官方戰略合作共建——HarmonyOS技術社區
第一個 hello 方法,注解的約束是,只有當前登錄用戶名為 javaboy 的用戶才可以訪問該方法。
第二個 admin 方法,表示訪問該方法的用戶必須具備 admin 角色。
第三個 user 方法,表示方法該方法的用戶必須具備 user 角色,但是注意 user 角色需要加上ROLE_ 前綴。
第四個 getAge 方法,表示訪問該方法的 age 參數必須大于 98,否則請求不予通過。
可以看到,這里的表達式還是非常豐富,如果想引用方法的參數,前面加上一個# 即可,既可以引用基本類型的參數,也可以引用對象參數。
缺省對象除了 principal ,還有 authentication(參考第一小節)。
3.使用過濾注解
Spring Security 中還有兩個過濾函數 @PreFilter 和 @PostFilter,可以根據給出的條件,自動移除集合中的元素。
@PostFilter("filterObject.lastIndexOf('2')!=-1") public List<String> getAllUser() { List<String> users = new ArrayList<>(); for (int i = 0; i < 10; i++) { users.add("javaboy:" + i); } return users; } @PreFilter(filterTarget = "ages",value = "filterObject%2==0") public void getAllAge(List<Integer> ages,List<String> users) { System.out.println("ages = " + ages); System.out.println("users = " + users); }
在 getAllUser 方法中,對集合進行過濾,只返回后綴為 2 的元素,filterObject 表示要過濾的元素對象。
在 getAllAge 方法中,由于有兩個集合,因此使用 filterTarget 指定過濾對象。
上述內容就是Spring Security中的四種權限控制方式分別是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。