springsecurity basic 認證


Basic Access Authentication scheme是在HTTP1.0提出的認證方法,它是一種基於challenge/response的認證模式,針對特定的realm需要提供用戶名和密碼認證后才可訪問,其中密碼使用明文傳輸。

Basic 認證是HTTP 中非常簡單的認證方式,因為簡單,所以不是很安全,不過仍然非常常用。

Basic模式認證過程如下:

①瀏覽器發送http報文請求一個受保護的資源。

②服務端的web容器將http響應報文的響應碼設為401,響應頭部加入WWW-Authenticate: Basic realm=”xxx”。

③瀏覽器會彈出默認對話框讓用戶輸入用戶名和密碼,並用Base64進行編碼,實際是用戶名+冒號+密碼進行Base64編碼,即Base64(username:password),然后瀏覽器就會在HTTP報文頭部加入這個編碼,形如:Authorization: Basic YWRtaW46YWRtaW4=

④服務端web容器獲取HTTP報文頭部相關認證信息,匹配此用戶名與密碼是否正確,是否有相應資源的權限,如果認證成功則返回相關資源,否則再執行②,重新進行認證。

⑤以后每次訪問都要帶上認證頭部。

Basic認證的優點是基本上所有流行的網頁瀏覽器都支持,一般被用在受信賴的或安全性要求不高的系統中(如路由器配置頁面的認證,tomcat管理界面認證)

缺點是,用戶名密碼基本等於是明文傳輸帶來很大風險,並且沒有注銷認證信息的手段,只能依靠關閉瀏覽器退出認證。

springsecurity中處理basic認證的是spring-security-web-4.1.2.RELEASE 中的org.springframework.security.web.authentication.www.BasicAuthenticationFilter。

核心代碼如下:

       //獲取報文頭部的Authorization: Basic YWRtaW46YWRtaW4= ,判斷是否是basic認證
     String header = request.getHeader("Authorization"); if (header == null || !header.startsWith("Basic ")) { chain.doFilter(request, response); return; } try { String[] tokens = extractAndDecodeHeader(header, request); assert tokens.length == 2; String username = tokens[0];if (authenticationIsRequired(username)) {
          //解碼后取出用戶名密碼生成spring-security的認證對象 UsernamePasswordAuthenticationToken authRequest
= new UsernamePasswordAuthenticationToken( username, tokens[1]); authRequest.setDetails( this.authenticationDetailsSource.buildDetails(request)); Authentication authResult = this.authenticationManager .authenticate(authRequest); if (debug) { this.logger.debug("Authentication success: " + authResult); }           //認證結果設置到SecurityContext中 SecurityContextHolder.getContext().setAuthentication(authResult); this.rememberMeServices.loginSuccess(request, response, authResult); onSuccessfulAuthentication(request, response, authResult); } }

以上就是basic認證和spring-security中的攔截方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM