1. 程式人生 > >(原創)Spring security使用者驗證機制淺談.

(原創)Spring security使用者驗證機制淺談.

1.首先CustomUserDetailsService需要實現UserDetailsService(org.springframework.security.core.userdetails.UserDetailsService)介面, 實現獲取使用者Detail資訊的回撥函式. 必須要實現的方法是loadUserByUsername

注意: 這裡的user類必須繼承userDetail, 並且必須繼承

privateString password;

privateString username;

privateSet<GrantedAuthority> authorities

;

privatebooleanaccountNonExpired;

privatebooleanaccountNonLocked;

privatebooleancredentialsNonExpired;

這五個屬性

hashCode, equals這兩個方法;

構造方法中必須給上述的5個屬性賦值, CustomUserDetailsService呼叫構造方法, 生成一個user物件;

如果user不存在, 這裡可以直接丟擲UsernameNotFoundException異常, 具體流程自己試驗下, 前臺SPRING_SECURITY_LAST_EXCEPTION顯示的錯誤是:”壞的憑證

2.loadUserByUsername方法返回後會跳到DaoAuthenticationProvider(org.springframework.security.authentication.dao.DaoAuthenticationProvider)類中retrieveUser方法中

3.retrieveUser方法返回後會跳到

AbstractUserDetailsAuthenticationProvider(org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider

) authenticate方法中,這個方法會先到快取中查詢user:

String username =(authentication.getPrincipal() == null) ? "NONE_PROVIDED" : authentication.getName();

boolean cacheWasUsed = true;

UserDetails user = this.userCache.getUserFromCache(username);

如果沒有的話會從上一步DaoAuthenticationProviderloadUserByUsername方法把user查出來。這裡會拋UsernameNotFoundException這個異常, 應該是使用者不存在這個錯誤, Bad credentials.

4. authenticate方法裡面

preAuthenticationChecks.check(user);這裡進行基本有效性驗證(是否有效, 是否被鎖, 是否過期); 程式碼如下:

if (!user.isAccountNonLocked()) {

thrownew LockedException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.locked",

"User account is locked"), user);

}

if (!user.isEnabled()) {

thrownew DisabledException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.disabled",

"User is disabled"), user);

}

if (!user.isAccountNonExpired()) {

thrownew AccountExpiredException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.expired",

"User account has expired"), user);

}

5.authenticate方法裡面

additionalAuthenticationChecks(user,(UsernamePasswordAuthenticationToken) authentication);這裡進行密碼驗證.

additionalAuthenticationChecks呼叫的是DaoAuthenticationProvider(org.springframework.security.authentication.dao.DaoAuthenticationProvider)中的additionalAuthenticationChecks的方法; 應該是繼承的關係;
具體比較的方法寫在 Md4PasswordEncoder(
org.springframework.security.authentication.encoding.Md5PasswordEncoder)類中的

 public boolean isPasswordValid(String encPass, String rawPass, Object salt) 方法中; 可是debug中中不到
Md5PasswordEncoder實現的isPasswordValid方法; 這很蹊蹺...不過根據配置檔案中; 加密方式應該是md5;
<!-- 使用者的密碼加密或解密 -->
    <bean id="passwordEncoder"
        class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" />

<!-- 注意能夠為authentication-manager 設定alias別名  -->
    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="userDetailsManager">
            <password-encoder ref="passwordEncoder">
                <salt-source user-property="username" />
            </password-encoder>
        </authentication-provider>
    </authentication-manager>
所以應該
Md5PasswordEncoder也有實現isPasswordValid(String encPass, String rawPass, Object salt) 這個方法;

至於前臺password怎麼傳到這裡; spring security攔截了j_spring_security_check請求; 並把j_password賦給了
DaoAuthenticationProvider(org.springframework.security.authentication.dao.DaoAuthenticationProvider)中passwordEncoder屬性; 這個還沒驗證過;

/** auth張振斌, time: 2012-12-3**/  QQ:739934487

相關推薦

(原創)Spring security使用者驗證機制.

1.首先CustomUserDetailsService需要實現UserDetailsService(org.springframework.security.core.userdetails.UserDetailsService)介面, 實現獲取使用者Detail資訊的

如何自定義事件(Spring事件機制)

       LZ第一次在工作中接觸Spring事件機制是專案中的定時任務,當Spring容器初始化完成時,把配置在資料庫中的定時任務資料全部載入.此時只用定義一個類實現ApplicationListener<ContextRefreshedEvent>介面,並

mysql 鎖機制

導讀: 鎖是計算機協調多個程序或純執行緒併發訪問某一資源的機制。在資料庫中,除傳統的計算資源(CPU、RAM、I/O)的爭用以外,資料也是一種供許多使用者共享的資源。如何保證資料併發訪問的一致性、有效性是所在有資料庫必須解決的一個問題,鎖衝突也是影響資料庫併發訪問效能的一個

Java spi機制

最近看到公司的一些框架和之前看到的開源的一些框架的一些服務發現和接入都採用了java的spi機制。 所以簡單的總結下java spi機制的思想。 我們系統裡抽象的各個模組,往往有很多不同的實現方案,比如日誌模組的方案,xml解析模組、jdbc模組的方案等。面向的物件

Spring系列學習之Spring Security身份驗證與授權

英文原文:https://spring.io/projects/spring-security 目錄 概述 特性 快速開始 學習 文件 指南 概述 Spring Security是一個功能強大且可高度自定義的身份驗證和訪問控制框架。 它是保護基於Spring的

Spring源碼分析 之設計模式

throw rup change getheight 配置 owa 委派 bean 松耦合 一直想專門寫個Spring源碼的博客,工作了,可以全身性的投入到互聯網行業中。雖然加班很嚴重,但是依然很開心。趁著淩晨有時間,總結總結。 首先spring,相信大家都很熟悉了。

spring security登入驗證

import com.qingxing.ManagerComplex.api.util.DateUtils; import com.qingxing.ManagerComplex.api.util.LogUtil; import com.qingxing.Man

類加載機制--

雙親委派 我們 請求 new ble 如果 規範 數據結構 派生類 一、定義: 類加載(Class Loading)是一種機制,他描述的是將字節碼以文件形式加載到內存再經過連接、初始化後,最終形成可以被虛擬機直接使用的Java類型地過程。 Class L

Spring Security登入驗證流程原始碼解析

一、登入認證基於過濾器鏈 Spring Security的登入驗證流程核心就是過濾器鏈。當一個請求到達時按照過濾器鏈的順序依次進行處理,通過所有過濾器鏈的驗證,就可以訪問API介面了。 SpringSecurity提供了多種登入認證的方式,由多種Filter過濾器來實現,比如: BasicAuthent

深入Spring Security-獲取認證機制核心原理講解

文/朱季謙 本文基於Springboot+Vue+Spring Security框架而寫的原創筆記,demo程式碼參考《Spring Boot+Spring Cloud+Vue+Element專案實戰:手把手教你開發許可權管理系統》一書。能力有限,存在不足還請指出,本文僅當做學習筆記。   在神祕的

spring security 403機制

403就是access denied ,就是請求拒絕,因為許可權不足 三種許可權級別 一、無許可權訪問 <security:http security="none" pattern="/index.jsp"   /> 這種即是不需要登入,也可以訪問的,但是不會傳

springboot學習總結(九)Spring security原理

學習 security uwp manage adg aac dsi sin aci 認證是由 AuthenticationManager 來管理的,但是真正進行認證的是 AuthenticationManager 中定義的 AuthenticationProvider。A

spring security中的許可權控制

當我們在OAuth登陸後,獲取了登陸的令牌,使用該令牌,我們就有了訪問一些受OAuth保護的介面的能力。具體可以看本人的這兩篇部落

Spring Security框架下Restful Token的驗證方案

false rri blob 返回 sch date html 官方 form 項目使用Restful的規範,權限內容的訪問,考慮使用Token驗證的權限解決方案。 驗證方案(簡要概括): 首先,用戶需要登陸,成功登陸後返回一個Token串; 然後用戶訪問有權限的內容時需要

Spring Security-- 驗證碼功能的實現

turn stringbu overflow .net 內容 一個 子類 異常 too spring security4 添加驗證碼 http://www.itwendao.com/article/detail/165400.html http://www.itdada

JAVA驗證碼~

puts oid blog 方式 log 需求 .html index.jsp script 這兩天在幫同學做個項目,項目中需要做個驗證碼,說實話那麽多年竟然沒註意過這東西,原理很簡單,貼出來給大家做個參考。 1、簡單介紹 一般稍微有些經驗的程序員都不會再自己寫原生驗證碼生

原創webview(一)——驚鴻一瞥

版本 開發 spa 占用 混合 原創 大量 功能性 內存泄漏 眾所周知,APP開發過程中經常會通過webview實現HTML5(H5)的渲染,實現H5和Native的混合開發(Hybrid Development)。Hybrid Development可以加速

spring中AOP以及spring中AOP的註解方式

早就 好的 面向 XML ram ati alt 返回 增強   AOP(Aspect Oriented Programming):AOP的專業術語是"面向切面編程" 什麽是面向切面編程,我的理解就是:在不修改源代碼的情況下增強功能.好了,下面在講述aop註解方式的情況下順

利用同步機制解決Java中的線程安全問題

顯示 重要 false 希望 運行程序 obj balance urn 什麽 我們知道大多數程序都不會是單線程程序,單線程程序的功能非常有限,我們假設一下所有的程序都是單線程程序,那麽會帶來怎樣的結果呢?假如淘寶是單線程程序,一直都只能一個一個用戶去訪問,你要在網上買東西還

java中內置的觀察模式與動態代理的實現

所有 代理 notify play ani effect 一個 indicate protected 一.關於觀察者模式 1.將觀察者與被觀察者分離開來,當被觀察者發生變化時,將通知所有觀察者,觀察者會根據這些變化做出對應的處理。 2.jdk裏已經提供對應的Observer