欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
spring-security 登陸認證之初次探究

首先,希望還對 spring-security框架完全不懂的新手 下載下Git源碼。 引入到項目中。這個(gè)短文就是邊看源碼邊聊的。也會(huì )啟動(dòng)下項目驗證自己的推想。

 

一、登陸認證的登陸配置項

<form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?error=true" default-target-url="/index.ht"   username-parameter="username" password-parameter="password" login-processing-url="/j_spring_security_check"/> <logout logout-url="/logout.ht"/>

 

看到這個(gè)配置,其實(shí)就大略明白了。 這就像配置了一個(gè)control/Servlet, userName 參數名字為 ”name“,password 為”password“

然后校驗用戶(hù)密碼,通過(guò)就跳轉的頁(yè)面為 index.ht 。 

 

spring-security框架維護了一個(gè)過(guò)濾器鏈來(lái)提供服務(wù), 而<form-login/> 這個(gè)登陸配置項其實(shí)創(chuàng )建了一個(gè)名為UsernamePasswordAuthenticationFilter的過(guò)濾器 。

框架提供的這些過(guò)濾器,也包括<custom-filter/>配置的過(guò)濾器。都是通過(guò)假名有嚴格順序來(lái)執行的。稍后詳細介紹自定義過(guò)濾器。

UsernamePasswordAuthenticationFilter : 

正如我們配置的這些參數,也會(huì )有默認配置的   比如

usernameParameter = SPRING_SECURITY_FORM_USERNAME_KEY =“j_username”,

passwordParameter=“j_password”

默認接受form請求地址 :j_spring_security_check ,

這些可配置的參數,都會(huì )存在默認參數。這些參數的讀取是在 Initializing Spring root WebApplicationContext 后,加載并且解析xml配置文件。然后初始化ioc 容器。形成上面所提的過(guò)濾器鏈。

 

二、簡(jiǎn)單說(shuō)一下解析xml 過(guò)程

HttpSecurityBeanDefinitionParser.parse() {  filterChains.add(createFilterChain(element, pc)); }

createFilterChain方法會(huì )調用 AuthenticationConfigBuilder的構造方法 初始化各種filter        createFormLoginFilter(sessionStrategy, authenticationManager); 即為登錄配置信息xml的解析處理方法:

 

 

SecurityNamespaceHandler.parse(Element element, ParserContext pc)  //關(guān)鍵代碼:String name = pc.getDelegate().getLocalName(element); BeanDefinitionParser parser = parsers.get(name); 通過(guò)配置項的名字。以策略模式獲取到專(zhuān)用解析器 都實(shí)現自BeanDefinitionParser 接口, 通過(guò)父類(lèi)的引用執行子類(lèi)的具體實(shí)現。調用這些子類(lèi)的parse()方法eg:RememberMeBeanDefinitionParser,LogoutBeanDefinitionParser等、、

 

<form-login/> 的解析在 FormLoginBeanDefinitionParser,  解析后拿到配置的參數,然后初始化一個(gè)filter 。

不知道這個(gè)解析方法為啥沒(méi)有實(shí)現BeanDefinitionParser 。 本來(lái)不想貼代碼的。更想愿意讀的人自己下載源碼自己看。

 

三、獲取登陸獲取賬號密碼

切面走到這個(gè)登陸過(guò)濾器的時(shí)候   UsernamePasswordAuthenticationFilter.attemptAuthentication()  的方法    會(huì )從request中,通過(guò)配置的userNameParam ,passwordParam 獲取 name password

然后構造一個(gè)包裝了密碼賬號的對象: new UsernamePasswordAuthenticationToken(password,username)

然后調用接口 AuthenticationManager.authenticate() (認證管理類(lèi)中的一個(gè)實(shí)現類(lèi) ProviderManager的認證方法

 

四、配置驗證密碼的認證管理類(lèi)

配置認證管理類(lèi) AuthenticationManager 需要 給它提供了一個(gè) user-service  bean    來(lái)通過(guò)用戶(hù)名獲取用戶(hù) 

這個(gè)userDetailProvider bean 需要實(shí)現 UserDetailsService接口 提供一個(gè) loadUserByUsername()方法。

配置項:

<security:authentication-manager alias="authenticationManager"><security:authentication-provider user-service-ref="userDetailProvider"/> </security:authentication-manager>
<bean id="userDetailProvider" class="com.hotent.web.security.provider.UserAuthProvider"/> 

然后 從ProviderManager 中的  List<AuthenticationProvider> providers認證策略都  拿出來(lái) 進(jìn)行認證(虛)

AbstractUserDetailsAuthenticationProvider .authenticate()

          retrieveUser() // 調用子類(lèi)DaoAuthenticationProvider的實(shí)現方法

DaoAuthenticationProvider.retrieveUser() 會(huì )通過(guò)我之前配置的userDetailProvider.loadUserByUsername(username),獲取用戶(hù),

然后preAuthenticationChecks.check(user);  校驗用戶(hù)是否可用、鎖定、過(guò)期

然后調用additionalAuthenticationChecks()方法驗證密碼。 

 

 五、配置 密碼加密方式

接著(zhù)我登陸不上才發(fā)現沒(méi)有配置密碼的加密類(lèi)型。隨便找了 個(gè)文檔。配了下、居然發(fā)現啟動(dòng)不了,妹的。

還好我比較機智,找到了xsd校驗文件

 

順利找到了正確配置方法,在authentication-provider    element下、 有一個(gè)password-encoder   xs:element

 

這個(gè)element 有個(gè)attribute<xs:attributeGroup ref="security:password-encoder.attlist"/>,這個(gè)想必就是spring-security所支持的所有加密類(lèi)型了。那xml 就改成了 這樣

 

最終authenticationManager的配置  如下

<security:authentication-manager alias="authenticationManager"><!-- 鑒定管理類(lèi) -->          <security:authentication-provider  user-service-ref="userDetailProvider">             <security:password-encoder hash="sha-256"/>         </security:authentication-provider>      </security:authentication-manager>

 

其實(shí)很少有人這么傻著(zhù)從校驗文件 去查屬性的。 除了像我這種機智到二的人。 其實(shí)官方文檔說(shuō)的很清楚,而且xml也會(huì )有提示。但是我抱著(zhù)探究的態(tài)度還是直接看xsd。

這樣密碼加密校驗就通過(guò)。

接著(zhù)將成功登陸用戶(hù),和用戶(hù)信息發(fā)布出一個(gè)事件

 applicationEventPublisher.publishEvent(new AuthenticationSuccessEvent(authentication));

///

 

 

六、登陸的擴展

很多時(shí)候,我們希望做更多的擴展、比如加一些U盾之類(lèi)的口令啦、短信校驗啦。驗證碼啦。 那么要實(shí)現、可以加些自定義的過(guò)濾器,也可以重寫(xiě)一些方法,等等、初次探究,我現在還不夠清楚。  不過(guò)這些都略有些麻煩。

其實(shí)如果你自己去校驗用戶(hù)。然后將用戶(hù)登錄信息放入SecurityContext 里面 也就可以隨心所欲了。

 

如下圖   驗證賬號密碼、驗證碼 的截圖略過(guò)   !直接是驗證密碼后的操作。

 

關(guān)鍵代碼  

  UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, encrptPassword);  authRequest.setDetails(new WebAuthenticationDetails(request));  SecurityContext securityContext = SecurityContextHolder.getContext();  Authentication auth = authenticationManager.authenticate(authRequest);   securityContext.setAuthentication(auth);  sessionStrategy.onAuthentication(auth, request, response);   

注入要使用的類(lèi)

  @Resource(name = "authenticationManager")    private AuthenticationManager authenticationManager = null;    @Resource    UserDetailsService userDetailsService;    @Resource    private SessionAuthenticationStrategy sessionStrategy= new NullAuthenticatedSessionStrategy();

 

注入的authenticationManager 其實(shí)就是之前寫(xiě)到的  ProviderManager

我們直接使用用戶(hù)名,密碼(加密后) 構建了UsernamePasswordAuthenticationToken(為存放密碼賬號信息的一個(gè)令牌) 是Authentication接口的一個(gè)實(shí)例。然后把構建好的  authentication 發(fā)送給authenticationManager 進(jìn)行校驗 。

authenticationManager 成功校驗后,返回一個(gè)完全的 Authentication 實(shí)例。

SecurityContextHolder.getContext().setAuthentication(...)

Spring Security 并不知道你怎么把Authentication 對象 放到了SecurityContextHolder 里面,唯一關(guān)鍵點(diǎn)就是 “SecurityContextHolder 已經(jīng)包含了一個(gè) Authentication 標識了一個(gè)主體”。  這樣就能滿(mǎn)足AbstractSecurityInterceptor 之前的驗證一個(gè)用戶(hù)需要。

 所以、這個(gè)authentication放入SecurityContextHolder的過(guò)程可以有很多種方式、一個(gè)過(guò)濾器、一個(gè)control方法、就能達到目的,自然就實(shí)現了登陸。

 

 

 

 

有空繼續

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Spring Security(2):過(guò)濾器鏈(filter chain)的介紹
解析Acegi Security System for Spring
Spring 安全架構專(zhuān)題教程
Spring Security,沒(méi)有看起來(lái)那么復雜(附源碼)
spring security 11種過(guò)濾器介紹 - Eryk - JavaEye技術(shù)網(wǎng)站
實(shí)現自定義的 AuthenticationProvider
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久