中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Security如何自定義驗證方法

發布時間:2021-08-13 12:35:42 來源:億速云 閱讀:381 作者:小新 欄目:編程語言

這篇文章主要介紹Spring Security如何自定義驗證方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Spring Security的本質

Spring Security 本質上是一連串的 Filter , 然后又以一個獨立的 Filter 的形式插入到 Filter Chain 里,其名為 FilterChainProxy 。 如圖所示。

Spring Security如何自定義驗證方法 

實際上 FilterChainProxy 下面可以有多條 Filter Chain ,來針對不同的URL做驗證,而 Filter Chain 中所擁有的 Filter 則會根據定義的服務自動增減。所以無需要顯示再定義這些 Filter ,除非想要實現自己的邏輯。

Spring Security如何自定義驗證方法 

關鍵類

Authentication

Authentication 是一個接口,用來表示用戶認證信息,在用戶登錄認證之前相關信息會封裝為一個 Authentication 具體實現類的對象,在登錄認證成功之后又會生成一個信息更全面,包含用戶權限等信息的 Authentication 對象,然后把它保存在 SecurityContextHolder 所持有的 SecurityContext 中,供后續的程序進行調用,如訪問權限的鑒定等。

AuthenticationManager

用來做驗證的最主要的接口為 AuthenticationManager ,這個接口只有一個方法:

public interface AuthenticationManager {
 Authentication authenticate(Authentication authentication)
 throws AuthenticationException;
}

其中 authenticate() 方法運行后可能會有三種情況:

驗證成功,返回一個帶有用戶信息的 Authentication 。

驗證失敗,拋出一個 AuthenticationException 異常。

無法判斷,返回 null 。

ProviderManager

ProviderManager 是上面的 AuthenticationManager 最常見的實現,它不自己處理驗證,而是將驗證委托給其所配置的 AuthenticationProvider 列表,然后會依次調用每一個 AuthenticationProvider 進行認證,這個過程中只要有一個 AuthenticationProvider 驗證成功,就不會再繼續做更多驗證,會直接以該認證結果作為 ProviderManager 的認證結果。

Spring Security如何自定義驗證方法 

認證過程

用戶使用用戶名和密碼進行登錄。

Spring Security 將獲取到的用戶名和密碼封裝成一個 Authentication 接口的實現類,比如常用的 UsernamePasswordAuthenticationToken 。

將上述產生的 Authentication 對象傳遞給 AuthenticationManager 的實現類 ProviderManager 進行認證。

ProviderManager 依次調用各個 AuthenticationProvider 進行認證,認證成功后返回一個封裝了用戶權限等信息的 Authentication 對象。

將 AuthenticationManager 返回的 Authentication 對象賦予給當前的 SecurityContext 。

自定義驗證

有了以上的知識儲備后就可以來自定義驗證方法了。通過上面可以看出,實際上真正來做驗證操作的是一個個的 AuthenticationProvider ,所以如果要自定義驗證方法,只需要實現一個自己的 AuthenticationProvider 然后再將其添加進 ProviderManager 里就行了。

自定義AuthenticationProvider

@Component
public class CustomAuthenticationProvider
 implements AuthenticationProvider {
 @Override
 public Authentication authenticate(Authentication authentication) 
 throws AuthenticationException {
 String name = authentication.getName();
 String password = authentication.getCredentials().toString();
 if (shouldAuthenticateAgainstThirdPartySystem()) {
  // use the credentials
  // and authenticate against the third-party system
  return new UsernamePasswordAuthenticationToken(
  name, password, new ArrayList<>());
 } else {
  return null;
 }
 }
 @Override
 public boolean supports(Class<?> authentication) {
 return authentication.equals(
  UsernamePasswordAuthenticationToken.class);
 }
}

其中的 supports() 方法接受一個 authentication 參數,用來判斷傳進來的 authentication 是不是該 AuthenticationProvider 能夠處理的類型。

注冊AuthenticationProvider

現在再將剛創建的 AuthenticationProvider 在 與ProviderManager 里注冊,所有操作就完成了。

@Configuration
@EnableWebSecurity
@ComponentScan("org.baeldung.security")
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 @Autowired
 private CustomAuthenticationProvider authProvider;
 @Override
 protected void configure(
 AuthenticationManagerBuilder auth) throws Exception {
 auth.authenticationProvider(authProvider);
 }
 @Override
 protected void configure(HttpSecurity http) throws Exception {
 http.authorizeRequests().anyRequest().authenticated()
  .and()
  .httpBasic();
 }
}

以上是“Spring Security如何自定義驗證方法”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长泰县| 绥棱县| 铁力市| 襄汾县| 竹山县| 高陵县| 兰坪| 工布江达县| 南皮县| 哈巴河县| 双桥区| 曲阳县| 同江市| 山丹县| 安陆市| 甘南县| 宁强县| 怀远县| 锡林浩特市| 邮箱| 台北市| 白山市| 四会市| 朔州市| 华亭县| 连南| 江源县| 山东省| 壤塘县| 乌兰县| 天台县| 龙州县| 台前县| 张家界市| 独山县| 西昌市| 桂阳县| 新乡县| 七台河市| 灌南县| 沙河市|