黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Spring Security(02)——關(guān)于登錄

系統(tǒng) 2230 0

關(guān)于登錄

目錄

1.1 ???? form-login 元素介紹

1.1.1 ??? 使用自定義登錄頁面

1.1.2 ??? 指定登錄后的頁面

1.1.3 ??? 指定登錄失敗后的頁面

1.2 ???? http-basic

?

1.1 ???? form-login 元素介紹

?????? http 元素下的 form-login 元素是用來定義表單登錄信息的。當(dāng)我們什么屬性都不指定的時候 Spring Security 會為我們生成一個默認(rèn)的登錄頁面。如果不想使用默認(rèn)的登錄頁面,我們可以指定自己的登錄頁面。

?

1.1.1???使用自定義登錄頁面

?????? 自定義登錄頁面是通過 login-page 屬性來指定的。提到 login-page 我們不得不提另外幾個屬性。

? ? username-parameter :表示登錄時用戶名使用的是哪個參數(shù),默認(rèn)是“ j_username ”。

? ? password-parameter :表示登錄時密碼使用的是哪個參數(shù),默認(rèn)是“ j_password ”。

? ? login-processing-url :表示登錄時提交的地址,默認(rèn)是“ /j-spring-security-check ”。這個只是 Spring Security 用來標(biāo)記登錄頁面使用的提交地址,真正關(guān)于登錄這個請求是不需要用戶自己處理的。

?

?????? 所以,我們可以通過如下定義使 Spring Security 在需要用戶登錄時跳轉(zhuǎn)到我們自定義的登錄頁面。

?? < security:http auto-config = "true" >

????? < security:form-login login-page = "/login.jsp"

???????? login-processing-url = "/login.do" username-parameter = "username"

???????? password-parameter = "password" />

????? <!-- 表示匿名用戶可以訪問 -->

????? < security:intercept-url pattern = "/login.jsp" access = "IS_AUTHENTICATED_ANONYMOUSLY" />

????? < security:intercept-url pattern = "/**" access = "ROLE_USER" />

?? </ security:http >

?

?????? 需要注意的是,我們之前配置的是所有的請求都需要 ROLE_USER 權(quán)限,這意味著我們自定義的“ /login.jsp ”也需要該權(quán)限,這樣就會形成一個死循環(huán)了。解決辦法是我們需要給“ /login.jsp ”放行。通過指定“ /login.jsp ”的訪問權(quán)限為“ IS_AUTHENTICATED_ANONYMOUSLY ”或“ ROLE_ANONYMOUS ”可以達(dá)到這一效果。此外,我們也可以通過指定一個 http 元素的安全性為 none 來達(dá)到相同的效果。如:

?? < security:http security = "none" pattern = "/login.jsp" />

?? < security:http auto-config = "true" >

????? < security:form-login login-page = "/login.jsp"

???????? login-processing-url = "/login.do" username-parameter = "username"

???????? password-parameter = "password" />

????? < security:intercept-url pattern = "/**" access = "ROLE_USER" />

?? </ security:http >

?????? 它們兩者的區(qū)別是前者將進(jìn)入 Spring Security 定義的一系列用于安全控制的 filter ,而后者不會。當(dāng)指定一個 http 元素的 security 屬性為 none 時,表示其對應(yīng) pattern filter 鏈為空。從 3.1 開始, Spring Security 允許我們定義多個 http 元素以滿足針對不同的 pattern 請求使用不能的 filter 鏈。當(dāng)為指定 pattern 屬性時表示對應(yīng)的 http 元素定義將對所有的請求發(fā)生作用。

?

?????? 根據(jù)上面的配置,我們自定義的登錄頁面的內(nèi)容應(yīng)該是這樣子的:

?? < form action = "login.do" method = "post" >

????? < table >

???????? < tr >

??????????? < td > 用戶名: </ td >

??????????? < td >< input type = "text" name = "username" /></ td >

???????? </ tr >

???????? < tr >

??????????? < td > 密碼: </ td >

??????????? < td >< input type = "password" name = "password" /></ td >

???????? </ tr >

???????? < tr >

??????????? < td colspan = "2" align = "center" >

??????????????? < input type = "submit" value = " 登錄 " />

??????????????? < input type = "reset" value = " 重置 " />

??????????? </ td >

???????? </ tr >

????? </ table >

?? </ form >

?

1.1.2???指定登錄后的頁面

通過 default-target-url 指定

?????? 默認(rèn)情況下,我們在登錄成功后會返回到原本受限制的頁面。但如果用戶是直接請求登錄頁面,登錄成功后應(yīng)該跳轉(zhuǎn)到哪里呢?默認(rèn)情況下它會跳轉(zhuǎn)到當(dāng)前應(yīng)用的根路徑,即歡迎頁面。通過指定 form-login 元素的 default-target-url 屬性,我們可以讓用戶在直接登錄后跳轉(zhuǎn)到指定的頁面。如果想讓用戶不管是直接請求登錄頁面,還是通過 Spring Security 引導(dǎo)過來的,登錄之后都跳轉(zhuǎn)到指定的頁面,我們可以通過指定 form-login 元素的 always-use-default-target 屬性為 true 來達(dá)到這一效果。

?

通過 authentication-success-handler-ref 指定

?????? authentication-success-handler-ref 對應(yīng)一個 AuthencticationSuccessHandler 實現(xiàn)類的引用。如果指定了 authentication-success-handler-ref ,登錄認(rèn)證成功后會調(diào)用指定 AuthenticationSuccessHandler onAuthenticationSuccess 方法。我們需要在該方法體內(nèi)對認(rèn)證成功做一個處理,然后返回對應(yīng)的認(rèn)證成功頁面。使用了 authentication-success-handler-ref 之后認(rèn)證成功后的處理就由指定的 AuthenticationSuccessHandler 來處理,之前的那些 default-target-url 之類的就都不起作用了。

?????? 以下是自定義的一個 AuthenticationSuccessHandler 的實現(xiàn)類。

public class AuthenticationSuccessHandlerImpl implements

????? AuthenticationSuccessHandler {

?

?? public void onAuthenticationSuccess(HttpServletRequest request,

???????? HttpServletResponse response, Authentication authentication)

???????? throws IOException, ServletException {

????? response.sendRedirect(request.getContextPath());

?? }

?

}

?

?????? 其對應(yīng)使用 authentication-success-handler-ref 屬性的配置是這樣的:

?? < security:http auto-config = "true" >

????? < security:form-login login-page = "/login.jsp"

???????? login-processing-url = "/login.do" username-parameter = "username"

???????? password-parameter = "password"

???????? authentication-success-handler-ref = "authSuccess" />

????? <!-- 表示匿名用戶可以訪問 -->

????? < security:intercept-url pattern = "/login.jsp"

???????? access = "IS_AUTHENTICATED_ANONYMOUSLY" />

????? < security:intercept-url pattern = "/**" access = "ROLE_USER" />

?? </ security:http >

?? <!-- 認(rèn)證成功后的處理類 -->

?? < bean id = "authSuccess" class = "com.xxx.AuthenticationSuccessHandlerImpl" />

?

1.1.3???指定登錄失敗后的頁面

?????? 除了可以指定登錄認(rèn)證成功后的頁面和對應(yīng)的 AuthenticationSuccessHandler 之外, form-login 同樣允許我們指定認(rèn)證失敗后的頁面和對應(yīng)認(rèn)證失敗后的處理器 AuthenticationFailureHandler 。

通過 authentication-failure-url 指定

?????? 默認(rèn)情況下登錄失敗后會返回登錄頁面,我們也可以通過 form-login 元素的 authentication-failure-url 來指定登錄失敗后的頁面。需要注意的是登錄失敗后的頁面跟登錄頁面一樣也是需要配置成在未登錄的情況下可以訪問,否則登錄失敗后請求失敗頁面時又會被 Spring Security 重定向到登錄頁面。

?? < security:http auto-config = "true" >

????? < security:form-login login-page = "/login.jsp"

???????? login-processing-url = "/login.do" username-parameter = "username"

???????? password-parameter = "password"

???????? authentication-failure-url = "/login_failure.jsp"

???????? />

????? <!-- 表示匿名用戶可以訪問 -->

????? < security:intercept-url pattern = "/login*.jsp*"

???????? access = "IS_AUTHENTICATED_ANONYMOUSLY" />

????? < security:intercept-url pattern = "/**" access = "ROLE_USER" />

?? </ security:http >

?

通過 authentication-failure-handler-ref 指定

?????? 類似于 authentication-success-handler-ref , authentication-failure-handler-ref 對應(yīng)一個用于處理認(rèn)證失敗的 AuthenticationFailureHandler 實現(xiàn)類。指定了該屬性, Spring Security 在認(rèn)證失敗后會調(diào)用指定 AuthenticationFailureHandler onAuthenticationFailure 方法對認(rèn)證失敗進(jìn)行處理,此時 authentication-failure-url 屬性將不再發(fā)生作用。

?

1.2 ???? http-basic

?????? 之前介紹的都是基于 form-login 的表單登錄,其實 Spring Security 還支持彈窗進(jìn)行認(rèn)證。通過定義 http 元素下的 http-basic 元素可以達(dá)到這一效果。

?? < security:http auto-config = "true" >

????? < security:http-basic />

????? < security:intercept-url pattern = "/**" access = "ROLE_USER" />

?? </ security:http >

??????

?????? 此時,如果我們訪問受 Spring Security 保護(hù)的資源時,系統(tǒng)將會彈出一個窗口來要求我們進(jìn)行登錄認(rèn)證。效果如下:


Spring Security(02)——關(guān)于登錄
?

?????? 當(dāng)然此時我們的表單登錄也還是可以使用的,只不過當(dāng)我們訪問受包含資源的時候 Spring Security 不會自動跳轉(zhuǎn)到登錄頁面。這就需要我們自己去請求登錄頁面進(jìn)行登錄。

?????? 需要注意的是當(dāng)我們同時定義了 http-basic form-login 元素時, form-login 將具有更高的優(yōu)先級。即在需要認(rèn)證的時候 Spring Security 將引導(dǎo)我們到登錄頁面,而不是彈出一個窗口。

?

(注:本文是基于 Spring Security3.1.6 所寫)

(注:原創(chuàng)文章,轉(zhuǎn)載請注明出處。原文地址: http://haohaoxuexi.iteye.com/blog/2154714

?

?

?

Spring Security(02)——關(guān)于登錄


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發(fā)表我的評論
最新評論 總共0條評論