Spring Security:如果身份验证失败,则重定向到登录页面

Posted

技术标签:

【中文标题】Spring Security:如果身份验证失败,则重定向到登录页面【英文标题】:Spring Security : Redirecting to login page if the authentication failed 【发布时间】:2011-07-24 10:52:37 【问题描述】:

我们有两种登录方式。

用户名和密码由另一个应用程序在请求标头中发送。检查 IT,如果用户名和密码正确,则进入。[为此编写了自定义过滤器] 如果请求标头中不存在用户名和密码,则会显示登录屏幕。

当用户名和密码出现在请求标头中并且错误时,我会看到 HTTP 状态 401 - 身份验证失败:凭据错误 页面。

如果验证失败,如何让它显示登录页面?

下面是security.xml中的代码

    <http auto-config="true" use-expressions="true">
             <access-denied-handler error-page="/login.jsp"/>
            <intercept-url pattern="/*Login*" access="hasRole('ROLE_ANONYMOUS')"/>
            <intercept-url pattern="/*" access="hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')"/>
            <custom-filter ref="requestHeaderFilter" before="FORM_LOGIN_FILTER"/>
            <form-login login-page="/login.jsp"/>

    </http>

如果您需要更多信息,请告诉我。

编辑:在我的应用程序中添加 RequestHeader 过滤器的代码

public class RequestHeaderProcessingFilter extends AbstractAuthenticationProcessingFilter

private String usernameHeader = "j_username";
private String passwordHeader = "j_password";


protected RequestHeaderProcessingFilter() 
    super("/login_direct");
 

//getters and setters

@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException 
    String username = request.getHeader(usernameHeader);
    String password = request.getHeader(passwordHeader);

     SignedUsernamePasswordAuthenticationToken authRequest =
        new SignedUsernamePasswordAuthenticationToken(username, password);

      return this.getAuthenticationManager().authenticate(authRequest); 

【问题讨论】:

【参考方案1】:

要在身份验证失败的情况下显示登录页面,您应该在 &lt;access-denied-handler error-page="/login.jsp"/&gt;&lt;intercept-url pattern="/*Login*" access="hasRole('ROLE_ANONYMOUS')"/&gt; 中使用相同的 url

例如:

<global-method-security secured-annotations="enabled" />

<http auto-config="true" access-denied-page="/app/sesiones/procesarLogin"> 
    <logout logout-success-url="/app/sesiones/login" />
    <form-login 
        authentication-failure-url="/app/sesiones/login?error=true"
        login-page="/app/sesiones/login" default-target-url="/app/sesiones/procesarLogin" />
    <intercept-url pattern="/app/privados/*" access="ROLE_USER" />
</http>

在该示例中,用户在注销后也会被重定向到登录页面。 /procesarLogin 是一种向用户发送登录.jsp 页面的方法。

【讨论】:

【参考方案2】:

身份验证失败的默认行为是显示 HTTP 状态 401。如果使用 SimpleUrlAuthenticationFailureHandler 处理失败(如 AbstractAuthenticationProcessingFilter 所做的那样,可以通过将 defaultFailureUrl 设置为 /login.jsp 来覆盖此行为。

或者,可以使用适当的操作定义自定义错误处理程序。

【讨论】:

嗨拉古拉姆,谢谢。我在哪里配置 defaultFailureUrl ?我必须在上面提供的代码中插入它吗? @vinoth。这取决于requestHeaderFilter 的实现。答案中提到的类显示了这样做的一种方法 嗨,我已经添加了 requestHeaderFilter 的实现。我们应该对此做出改变吗?【参考方案3】:

也可以试试这个:

@Configuration
@EnableWebSecurity
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter 

    .
    .
    .

    @Override
    protected void configure(HttpSecurity http) throws Exception 

        .
        .
        .

        http.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login").invalidateHttpSession(true).deleteCookies("JSESSIONID").permitAll();
    

在配置方法中,您可以添加过滤器管道和其他相关内容。 还可以配置对特定端点的角色访问,如您所见 https://docs.spring.io/spring-security/site/docs/current/guides/html5/form-javaconfig.html

【讨论】:

以上是关于Spring Security:如果身份验证失败,则重定向到登录页面的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 中的基本身份验证(身份验证失败消息)

我们可以将输入的用户名传递给spring security中的身份验证失败url吗?

用户身份验证失败时的 Spring Security ProviderNotFoundException

Spring-Security:MySQL JDBC 身份验证失败

Grails Spring Security 插件身份验证失败

使用 AuthenticationFailureHandler 在 Spring Security 中自定义身份验证失败响应