java - 如何从 Spring Security 中删除过滤器?

标签 java spring spring-security

Spring Security 4.0中,有一个所谓的默认登录页面,如下所示:

enter image description here

深入研究源代码我发现了过滤器 org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter

呈现该登录页面。实际上,它有 private StringgenerateLoginPageHtml(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 网址)。可能吗?

我的安全配置:

<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>

最佳答案

为什么你要“深入研究源头”而不是 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。这会禁用 DefaultLoginPageGenerateFilter

关于java - 如何从 Spring Security 中删除过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28658265/

相关文章:

Java Spring 类路径 :Spring does not find properties file in the class path

java - Spring安全未授权用户

java - 如何在gradle和其他资源文件夹中添加资源文件夹

java.lang.UnsatisfiedLinkError JNI错误

java - 来自 spring 属性的构造函数 arg 引用

security - 如何保护刷新 token 免受黑客攻击

spring-security - OWASP 十大攻击与 Spring Security

java - 通过 JNI 将我的 Java API 扩展到 C++ : How to wrap a method returning a String?

java - 为什么我在 Matrix 中填写 Integer.MAX_VALUE

java - 如何模拟 application.properties 文件?