1.spring security 過濾器鏈
spring security中的除了用戶登錄校驗相關的過濾器,最後還包含了鑑權功能的過濾器,還有匿名資源訪問的過濾器鏈,相關的圖解如下:
2.控制授權的相關類
這裏是整個spring security的過濾器鏈中的授權流程中控制權限的類的相關圖示:
這裏主要是從AccessDecisionVoter的投票者(譯稱)把信息傳遞給投票管理者AccessDecisionManager,最終來判斷是過還是不過(也就是有沒有權限).有兩種可能的類:
1.不管有多少請求投票不過,只要有一個過就可以通過(UnanimousBased);
2.不管有多少請求投票通過,只要有一個不通過就不讓通過(AffirmativeBased);
3.比較投通過和不通過的個數,誰多久就按照誰的方式來(Consensusbased).
這裏可以可能聽起來有點繞,但實際上就是三種控制權限的方式類,我們可以認爲Spring security已經幫我們做好了最終的判斷,我們只需要當一個旁觀者即可.
我們再來關注SecurityContextHolder這個類,他會將我們的權限信息封裝到Authentication中,SecurityConfig則是相關的Spring security的配置信息,這個類會將相關的信息傳遞到ConfigAttribute中.
3.配置簡單的權限
這個在身份信息固定,並且不會經常變動的情況下可以按照如下配置,否則不建議這麼做,這裏只適用於簡單的場景.
MyUserDetailsService:
private SocialUserDetails buildUser(String userId) {
// 根據用戶名查找用戶信息
//根據查找到的用戶信息判斷用戶是否被凍結
/**
* 可以從數據庫查出來用戶名和密碼進行比對,爲了方便我這裏就直接固定了
*/
String password = passwordEncoder.encode("123456");
logger.info("數據庫密碼是:"+password);
//注意這裏配置角色的時候需要加ROLE_前綴
return new SocialUser(userId, password,
true, true, true, true,
AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN"));
}
BrowserSecurityConfig:
//這裏是硬編碼權限 只限於簡單的用戶權限 這裏的角色名稱嚴格區分大小寫
//這裏可以指定HttpMethod 如HttpMethod.GET,
.antMatchers("/user/**").hasRole("ADMIN")
.anyRequest() //所有請求
.authenticated() //都需身份認證
4.項目git地址
(喜歡記得點星支持哦,謝謝!)