Spring security可以進行認(rèn)證和授權(quán),認(rèn)證和授權(quán)需要針對每一個請求,所以這個功能,可以用過濾器來實現(xiàn),spring security正是通過一系列過濾器來實現(xiàn)認(rèn)證和授權(quán)功能的。
成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)神池,10余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
我們來看看其中幾個比較重要的過濾器,類和接口。
public interfaceUserDetailsextendsSerializable{
Collection<?extendsGrantedAuthority>getAuthorities();
StringgetPassword();
StringgetUsername();
booleanisAccountNonExpired();
booleanisAccountNonLocked();
booleanisCredentialsNonExpired();
booleanisEnabled();
}
用來記錄用戶的信息,包括用戶名,權(quán)限等信息。
UserDetailsService接口用于返回用戶相關(guān)數(shù)據(jù)返回的是一個UserDetails實例,它有l(wèi)oadUserByUsername()方法,該方法可以根據(jù)username查詢用戶實體,可以實現(xiàn)該接口覆蓋該方法,實現(xiàn)自定義獲取用戶過程。
public interfaceUserDetailsService {
??? UserDetails loadUserByUsername(String var1)throwsUsernameNotFoundException;
}
?
封裝用戶信息的接口,UsernamePasswordAuthenticationToken是它的實現(xiàn)類,用戶登錄以后,用戶名,密碼等信息被封裝到了UsernamePasswordAuthenticationToken對象中。
它和UserDetails不同之處在于Authentication記錄的是當(dāng)前登錄用戶的信息,而UserDetails則是用戶信息的封裝。
public interfaceAuthenticationextendsPrincipal, Serializable {
??? Collection<?extendsGrantedAuthority> getAuthorities();
??? Object getCredentials();
??? Object getDetails();
??? Object getPrincipal();
???booleanisAuthenticated();
???voidsetAuthenticated(booleanvar1)throwsIllegalArgumentException;
}
?
getAuthorities方法獲取權(quán)限信息的列表
getCredentials方法獲取用戶認(rèn)證時輸入的密碼
getDetails方法獲取訪問者的ip地址和sessionid的值
getPrincipal方法獲取用戶的信息,大部分情況下返回的是UserDetails接口的實現(xiàn)類
?
是認(rèn)證相關(guān)的核心接口,用來處理認(rèn)證請求,如果認(rèn)證成功則返回一個Authentication接口的實例,它的默認(rèn)實現(xiàn)類是:ProviderManager。
?
?
SecurityContext:是安全上下文接口,用來存儲認(rèn)證授權(quán)的相關(guān)信息,這個接口只有兩個方法,Authentication對象的getter、setter。
public interface SecurityContext extends Serializable {
??? Authentication getAuthentication();
?
??? void setAuthentication(Authentication var1);
}
?
保存系統(tǒng)當(dāng)前的安全上下文,包括當(dāng)前使用系統(tǒng)的用戶的信息。
?
該接口有很多實現(xiàn)類,它用來在認(rèn)證的過程中使用matches方法比對密碼,具體如何比對密碼則取決于PasswordEncoder的實現(xiàn)類。
public interfacePasswordEncoder {
??? String encode(CharSequence var1);
???booleanmatches(CharSequence var1, String var2);
}
比如不對密碼進行加密,采用明文字符串進行比對可以:
@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
但是在實際項目中我們往往會對密碼進行加密,比較常用的PasswordEncoder實現(xiàn)類有:、
BCryptPasswordEncoder, Pbkdf2PasswordEncoder, SCryptPasswordEncoder
如果使用BcryptPasswordEncoder:
則:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
?
認(rèn)證流程:
1.用戶提交用戶名密碼被UsernamePasswordAuthenticationFilter過濾器獲取到,
封裝為Authentication接口的實例,通常情況下是UsernamePasswordAuthenticationToken。
2.過濾器將Authentication提交至認(rèn)證管理器(AuthenticationManager)進行認(rèn)證,認(rèn)證成功后返回一個被填充滿信息的Authentication實例.
3. SecurityContextHolder保存返回的Authentication實例.
?
?
?
授權(quán)流程:
1.攔截請求:已認(rèn)證的用戶請求將會被過濾器:FilterSecurityInterceptor攔截。
2. FilterSecurityInterceptor獲取訪問權(quán)限,該權(quán)限就是我們配置的訪問規(guī)則如。
http
.authorizeRequests()
.antMatchers("/r/r1").hasAuthority("p1")
.antMatchers("/r/r2").hasAuthority("p2")
3. FilterSecurityInterceptor會調(diào)用訪問決策管理器 AccessDecisionManager進行授權(quán)決策,若決策通過,則允許訪問資源,否則將禁止訪問
AccessDecisionManager:訪問決策管理器,用來控制用戶是否有相應(yīng)的權(quán)限。
public interfaceAccessDecisionManager{
/**
*通過傳遞的參數(shù)來決定用戶是否有訪問對應(yīng)受保護資源的權(quán)限
*/
voiddecide(Authentication authentication,Objectobject,Collection<ConfigAttribute>
configAttributes) throwsAccessDeniedException,InsufficientAuthenticationException;
//略..
}
參數(shù)說明:
Authentication:要訪問資源的訪問者
object:要訪問的受保護資源
configAttributes:是受保護資源的訪問策略
decide方法就是用來判斷訪問者是否有訪問某資源的權(quán)限。
它用投票的方式來決定是否有訪問某資源的權(quán)限
文章名稱:SpringSecurity五:Springsecurity原理
標(biāo)題來源:http://bm7419.com/article44/jcsehe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、移動網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、網(wǎng)站導(dǎo)航、標(biāo)簽優(yōu)化、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)