为什么我的自定义登录页面不显示 Spring Security 4?
Why doesn't my custom login page show with Spring Security 4?
我可以使用带有 Spring Security 3.2.4 的自定义登录页面,但是在使用 4.0.0 使用下面的代码迁移后,我看到了一个通用登录表单而不是我的自定义登录表单:
<beans:bean id="authSuccessHandler" class="com.company.web.RoleBasedAuthenticationSuccessHandler" />
<http disable-url-rewriting="false" use-expressions="true">
<form-login login-page="/login"
username-parameter="j_username"
password-parameter="j_password"
login-processing-url="/j_spring_security_check"
authentication-failure-url="/login?login_error=true"
authentication-success-handler-ref="authSuccessHandler"/>
<!-- SOME INTERCEPT-URLs (redacted) -->
<intercept-url pattern="/login" access="permitAll"/>
<remember-me
remember-me-parameter="_spring_security_remember_me"
remember-me-cookie="SPRING_SECURITY_REMEMBER_ME_COOKIE"/>
<logout
logout-url="/j_spring_security_logout"
logout-success-url="/index" />
</http>
我还尝试在各种 Spring 类 上启用调试日志记录。我将它设置在我的自定义 authSuccessHandler 上,但我没有看到它的任何输出。在 SO 或 Google 上搜索也不走运。
这个配置有什么不兼容的地方吗?
更新:
我也这样使用 Apache Tiles:
<definition name="login" extends="scrollableLayout">
<put-attribute name="header" value="/WEB-INF/jsp/heading_blue.jsp"/>
<put-attribute name="body" value="/WEB-INF/jsp/login.jsp"/>
</definition>
并使用以下内容:
<mvc:view-controller path="/login" />
Spring 安全 3.x 使用 spring_security_login
作为默认登录名 URL (source
: official documentation)。这可以设置为自定义值 <security:form-login login-page="/login">
并映射到控制器以呈现自定义页面。
Spring 安全 4.x 已放弃 spring_security_login
并切换到 login
作为默认登录 URL (source
: official Spring Security 4.x migration guide).因此,URL login
现在转到默认的 Spring 安全基础结构,显示默认的自动生成的登录页面。
如果您使用 JSP 作为视图渲染技术,补救措施很简单。只需将您的登录页面重命名为 login.jsp
,将其放入页面层次结构的根文件夹中,Spring 安全将自动选取它。如果您不使用 JSP,则必须使用不同的 login-page
值(也许 signin
而不是 login
,然后还要更改您的控制器映射。
请注意,默认注销 URL 在 4.x 中也已更改。如果您有任何为注销编写的自定义逻辑 URL,请确保也查看它。
请查看官方迁移指南,因为 4.x 中的很多内容都发生了变化。
我可以使用带有 Spring Security 3.2.4 的自定义登录页面,但是在使用 4.0.0 使用下面的代码迁移后,我看到了一个通用登录表单而不是我的自定义登录表单:
<beans:bean id="authSuccessHandler" class="com.company.web.RoleBasedAuthenticationSuccessHandler" />
<http disable-url-rewriting="false" use-expressions="true">
<form-login login-page="/login"
username-parameter="j_username"
password-parameter="j_password"
login-processing-url="/j_spring_security_check"
authentication-failure-url="/login?login_error=true"
authentication-success-handler-ref="authSuccessHandler"/>
<!-- SOME INTERCEPT-URLs (redacted) -->
<intercept-url pattern="/login" access="permitAll"/>
<remember-me
remember-me-parameter="_spring_security_remember_me"
remember-me-cookie="SPRING_SECURITY_REMEMBER_ME_COOKIE"/>
<logout
logout-url="/j_spring_security_logout"
logout-success-url="/index" />
</http>
我还尝试在各种 Spring 类 上启用调试日志记录。我将它设置在我的自定义 authSuccessHandler 上,但我没有看到它的任何输出。在 SO 或 Google 上搜索也不走运。
这个配置有什么不兼容的地方吗?
更新:
我也这样使用 Apache Tiles:
<definition name="login" extends="scrollableLayout">
<put-attribute name="header" value="/WEB-INF/jsp/heading_blue.jsp"/>
<put-attribute name="body" value="/WEB-INF/jsp/login.jsp"/>
</definition>
并使用以下内容:
<mvc:view-controller path="/login" />
Spring 安全 3.x 使用 spring_security_login
作为默认登录名 URL (source
: official documentation)。这可以设置为自定义值 <security:form-login login-page="/login">
并映射到控制器以呈现自定义页面。
Spring 安全 4.x 已放弃 spring_security_login
并切换到 login
作为默认登录 URL (source
: official Spring Security 4.x migration guide).因此,URL login
现在转到默认的 Spring 安全基础结构,显示默认的自动生成的登录页面。
如果您使用 JSP 作为视图渲染技术,补救措施很简单。只需将您的登录页面重命名为 login.jsp
,将其放入页面层次结构的根文件夹中,Spring 安全将自动选取它。如果您不使用 JSP,则必须使用不同的 login-page
值(也许 signin
而不是 login
,然后还要更改您的控制器映射。
请注意,默认注销 URL 在 4.x 中也已更改。如果您有任何为注销编写的自定义逻辑 URL,请确保也查看它。
请查看官方迁移指南,因为 4.x 中的很多内容都发生了变化。