簡體   English   中英

spring認證過濾模式

[英]spring authentication filter pattern

我正在使用Spring Security模塊開發Spring應用程序。 基本設置工作得很好,但是當我想制作一些邏輯時,“FormLogin頁面是唯一一個允許任何人使用的頁面,只有用戶通過身份驗證才能看到所有其他的。所以我的spring配置文件就像:

<security:http security="none" pattern="/resources/**" />
    <security:http security="none" pattern="/FormLogin" />
    <security:http auto-config="true" use-expressions="true">
        <security:csrf disabled="true" />
        <security:intercept-url pattern="/**"
            access="isAuthenticated()" />
        <security:intercept-url pattern="/admin/**"
            access="hasRole('Admin')" />
        <security:logout logout-success-url="/welcome"
            logout-url="/logout" />
        <security:form-login login-page="/FormLogin"
            login-processing-url="/j_spring_security_check" default-target-url="/welcome"
            username-parameter="username" password-parameter="hashPwd"
            authentication-failure-url="/loginError" />
    </security:http>

所以基本上我將管理員文件夾保留給管理員,FormLogin可以被任何人訪問,所有其他頁面只能由經過身份驗證的用戶查看。

沒有這一行:

<security:intercept-url pattern="/**"   access="isAuthenticated()" />

登錄后我正確地重定向到歡迎頁面,像這樣我被重定向到應用程序的根目錄,我得到以下消息:

22/06/2015 20:44:50 - DEBUG - (AbstractSecurityInterceptor.java:242) - Authorization successful
22/06/2015 20:44:50 - DEBUG - (AbstractSecurityInterceptor.java:255) - RunAsManager did not change Authentication object
22/06/2015 20:44:50 - DEBUG - (FilterChainProxy.java:309) - / reached end of additional filter chain; proceeding with original chain
22/06/2015 20:44:50 - DEBUG - (DispatcherServlet.java:861) - DispatcherServlet with name 'spring-mvc' processing GET request for [/Fantacalcio/]
22/06/2015 20:44:50 - DEBUG - (AbstractHandlerMethodMapping.java:294) - Looking up handler method for path /
22/06/2015 20:44:50 - DEBUG - (AbstractHandlerMethodMapping.java:302) - Did not find handler method for [/]
22/06/2015 20:44:50 - DEBUG - (AbstractHandlerMethodMapping.java:294) - Looking up handler method for path /
22/06/2015 20:44:50 - DEBUG - (AbstractHandlerMethodMapping.java:302) - Did not find handler method for [/]
22/06/2015 20:44:50 - DEBUG - (AbstractUrlHandlerMapping.java:123) - Mapping [/] to HandlerExecutionChain with handler [org.springframework.web.servlet.mvc.ParameterizableViewController@92464f] and 1 interceptor
22/06/2015 20:44:50 - DEBUG - (DispatcherServlet.java:947) - Last-Modified value for [/Fantacalcio/] is: -1
22/06/2015 20:44:50 - DEBUG - (DispatcherServlet.java:1241) - Rendering view [org.springframework.web.servlet.view.JstlView: name 'FormLogin'; URL [/WEB-INF/views/FormLogin.jsp]] in DispatcherServlet with name 'spring-mvc'
22/06/2015 20:44:50 - DEBUG - (InternalResourceView.java:166) - Forwarding to resource [/WEB-INF/views/FormLogin.jsp] in InternalResourceView 'FormLogin'
22/06/2015 20:44:50 - DEBUG - (FrameworkServlet.java:996) - Successfully completed request
22/06/2015 20:44:50 - DEBUG - (ExceptionTranslationFilter.java:116) - Chain processed normally
22/06/2015 20:44:50 - DEBUG - (SecurityContextPersistenceFilter.java:105) - SecurityContextHolder now cleared, as request processing completed

我究竟做錯了什么?

intercept-url標簽的順序很重要,因為它也是他們參考的順序。第一場比賽獲勝。 現在你的第一個intercept-url有一個pattern="/**"可以捕獲所有內容,這基本上會使你所有其他intercept-url模式無效。 您還沒有FormLogin頁面的映射,因此請添加它。

在模式中使用/** ,它總是必須是最后的!

如果您總是希望被重定向到'default-target-url中指定的URL, set the always-use-default-target attribute to true`。

<security:http security="none" pattern="/resources/**" />
    <security:http security="none" pattern="/FormLogin" />
    <security:http auto-config="true" use-expressions="true">
        <security:csrf disabled="true" />
        <security:intercept-url pattern="/FormLogin" access="permitAll" />
        <security:intercept-url pattern="/admin/**" access="hasRole('Admin')" />
        <security:intercept-url pattern="/**" access="isAuthenticated()" />
        <security:logout logout-success-url="/welcome" logout-url="/logout" />
        <security:form-login login-page="/FormLogin"
            login-processing-url="/j_spring_security_check" default-target-url="/welcome" always-use-default-target="true"
            username-parameter="username" password-parameter="hashPwd"
            authentication-failure-url="/loginError" />
</security:http>

也許您嘗試通過訪問“/”(應用程序的根目錄)登錄。 Spring Security的默認設置是,如果訪問了安全資源,則會將其中一個重定向到登錄頁面,並在成功登錄之后訪問之前訪問的Url。

您可以嘗試將“always-use-default-target”設置為“true”(“ form-login ”元素):

如果設置為“true”,則用戶將始終以default-target-url給定的值開始,無論他們如何到達登錄頁面。 映射到UsernamePasswordAuthenticationFilter的alwaysUseDefaultTargetUrl屬性。 默認值為“false”。

嘗試將“always-use-default-target”設置為true,即form-login元素,它始終以default-target-url給出的值開始,無論它們如何到達登錄頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM