spring认证过滤模式

时间:2015-06-22 18:51:32

标签: java spring spring-mvc spring-security

我正在使用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

我做错了什么?

3 个答案:

答案 0 :(得分:3)

intercept-url标签的顺序非常重要,因为这也是他们参考的顺序。第一场比赛获胜。现在,您的第一个intercept-url有一个pattern="/**"可以捕获所有内容,这基本上会使您的所有其他intercept-url模式无效。您还没有FormLogin页面的映射,因此请添加它。

在模式中使用/**时,它始终必须是最后一个!

如果您始终希望被重定向到'default-target-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>

答案 1 :(得分:0)

也许您尝试通过访问“/”(应用程序的根目录)登录。 Spring Security的默认设置是,如果访问了安全资源,则会将其重定向到登录页面,并在成功登录之后访问之前访问的Url。

您可以尝试将“always-use-default-target”设置为“true”(“form-login”元素):

  

如果设置为“true”,则用户将始终以default-target-url给定的值开始,无论他们如何到达登录页面。映射到UsernamePasswordAuthenticationFilter的alwaysUseDefaultTargetUrl属性。默认值为“false”。

答案 2 :(得分:0)

尝试将“always-use-default-target”设置为true,即form-login元素,它始终以default-target-url给定的值开始,无论它们如何到达登录页面。