我正在使用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
我做错了什么?
答案 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给定的值开始,无论它们如何到达登录页面。