在Spring Security 4.0
中,有一个所谓的Default Login Page
,如下所示:
在我找到过滤器的源代码中挖了一下 org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter
,它呈现登录页面。实际上,它有private String generateLoginPageHtml(HttpServletRequest request, boolean loginError, boolean logoutSuccess)
方法,其中包含以下代码段:
if (formLoginEnabled) {
sb.append("<h3>Login with Username and Password</h3>");
sb.append("<form name='f' action='").append(request.getContextPath()).append(authenticationUrl).append("' method='POST'>\n");
sb.append(" <table>\n");
sb.append(" <tr><td>User:</td><td><input type='text' name='");
sb.append(usernameParameter).append("' value='").append("'></td></tr>\n");
sb.append(" <tr><td>Password:</td><td><input type='password' name='").append(passwordParameter).append("'/></td></tr>\n");
if (rememberMeParameter != null) {
sb.append(" <tr><td><input type='checkbox' name='").append(rememberMeParameter).append("'/></td><td>Remember me on this computer.</td></tr>\n");
}
sb.append(" <tr><td colspan='2'><input name=\"submit\" type=\"submit\" value=\"Login\"/></td></tr>\n");
renderHiddenInputs(sb, request);
sb.append(" </table>\n");
sb.append("</form>");
}
问题是我想从过滤器链中删除该过滤器,以便自定义http://my-domain/login
网址所在的登录页面。有可能吗?
我的security-config:
<http auto-config="true">
<intercept-url pattern="/admin**"
access="hasRole('ROLE_USER')" />
<form-login login-page="/login"
default-target-url="/admin"
authentication-failure-url="/login?error=true"
username-parameter="user"
password-parameter="password"
login-processing-url="/login"/>
<logout logout-success-url="/login?logout" logout-url="/logout" />
</http>
答案 0 :(得分:3)
为什么你“挖掘源头”而不是documentation,它显然涵盖了这一点:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login");
}
只有在没有设置登录页面时才会生成默认登录页面。
如果您检查source code of AbstractAuthenticationFilterConfigurer
,您会看到:
protected T loginPage(String loginPage) {
this.loginPage = loginPage;
this.authenticationEntryPoint = new LoginUrlAuthenticationEntryPoint(loginPage);
this.customLoginPage = true;
return getSelf();
}
如果您查看source code of FormLoginConfigurer
:
private void initDefaultLoginFilter(H http) {
DefaultLoginPageViewFilter loginPageGeneratingFilter = http.getSharedObject(DefaultLoginPageViewFilter.class);
if(loginPageGeneratingFilter != null && !isCustomLoginPage()) {
//stuff
}
}
所以你看,调用loginPage
设置customLoginPage = true
。这会禁用
DefaultLoginPageGeneratingFilter
。
答案 1 :(得分:1)
您可以使用以下标签进行配置,即
<sec:form-login login-page="/login.html" default-target-url="/home.html" always-use-default-target="true"/>
同样注销
<sec:logout logout-url="/logoutnow.html" logout-success-url="/logout.html"/>
阅读文档以获取更多信息。
答案 2 :(得分:0)
我遇到了同样的问题。我必须使用xml配置spring security,而不是使用带注释的文件。我的解决方案是替换
form-login login-page="/login
通过
form-login login-page="/doLogin"
答案 3 :(得分:0)
问题SEC-2919涵盖此故障单,尝试升级到4.0.1
spring-issuemaster于2015年4月28日发表评论 Rick UPADHYAY(从SEC-2949迁移)说:
我创建了一个简单的spring mvc项目并添加了一个自定义登录页面。自定义登录适用于3.2.7但是当我升级到4.0.0时,相同的自定义登录无效。
spring-issuemaster于2015年4月28日发表评论 Rob Winch说:
你能详细说明“不起作用”是什么意思吗?
您是否尝试升级到4.0.1以确保这不是SEC-2919的副本?您确定使用迁移指南吗?
spring-issuemaster于2015年4月28日发表评论 Rick UPADHYAY说:
感谢您的快速回复。升级到4.0.1已经解决了我的问题。 SEC-2919是我的问题。抱歉,我们应首先搜索现有的JIRA问题。