如何从弹簧安全中删除过滤器?

时间:2015-02-22 13:21:13

标签: java spring spring-security

Spring Security 4.0中,有一个所谓的Default Login Page,如下所示:

enter image description here

在我找到过滤器的源代码中挖了一下 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>

4 个答案:

答案 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问题。