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

Java Spring安全性:如果身份验证失败,则重定向到登录页面,java,authentication,spring-security,Java,Authentication,Spring Security,我们有两种登录方式 用户名和密码由另一个应用程序在请求头中发送。它会被检查,如果用户名和密码正确,它就会进入。[为此编写了自定义筛选器] 如果请求头中没有用户名和密码,则会显示登录屏幕 当用户名和密码出现在请求头中时,如果出现错误,我将显示一个HTTP状态401-身份验证失败:错误凭据页面 如何在身份验证失败时显示登录页面 下面是security.xml中的代码 <http auto-config="true" use-expressions="true">

我们有两种登录方式

  • 用户名和密码由另一个应用程序在请求头中发送。它会被检查,如果用户名和密码正确,它就会进入。[为此编写了自定义筛选器]
  • 如果请求头中没有用户名和密码,则会显示登录屏幕

    当用户名和密码出现在请求头中时,如果出现错误,我将显示一个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>
    

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


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

    要在身份验证失败时显示登录页面,您应该在
    中使用相同的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是一种将用户发送到login.jsp页面的方法。

    也可以尝试以下操作:

    @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();
        }
    }
    
    在configure方法中,您可以添加filterpipeline和其他相关内容。 还可以像您看到的那样配置对特定端点的角色访问

    Hi Raghuram,谢谢。我在哪里配置defaultFailureUrl?我必须在上面提供的代码中插入它吗?@vinoth。这取决于
    requestHeaderFilter
    实现。答案中提到的类显示了一种方法。我添加了requestHeaderFilter.Sh的实现我们能在这方面做些改变吗?
    @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();
        }
    }