Spring Security:在 401 的情况下重定向到登录页面

Posted

技术标签:

【中文标题】Spring Security:在 401 的情况下重定向到登录页面【英文标题】:Spring Security: Redirect to Login Page in case of 401 【发布时间】:2015-11-30 09:50:00 【问题描述】:

我有一个公开 REST API 并使用 Spring Security 保护的应用程序。如果发送到我的服务器的请求导致 401 - 未经授权,有没有办法自动将客户端(从服务器端)重定向到登录页面?

【问题讨论】:

【参考方案1】:

您可以通过在 web.xml 的 error-page 元素中指定应用程序如何处理异常或 HTTP 状态代码

例如:web.xml

<error-page>
    <error-code>401</error-code>
    <location>/login.html</location>
</error-page>

与您处理其他 HTTP 状态代码(即 404 页面未找到页面)的方式相同。

【讨论】:

有没有办法使用基于 java/annotaion 的配置来做到这一点?【参考方案2】:

我通过在 http 节点下的 Spring Security XML 中添加以下元素解决了这个问题:

<security:access-denied-handler error-page="/#/login"  />
<security:session-management invalid-session-url="/#/login" session-fixation-protection="changeSessionId" />

【讨论】:

【参考方案3】:

对于基于spring-bootspring-security 应用程序。

定义一个处理程序 bean:

@Component
public class CommenceEntryPoint implements AuthenticationEntryPoint, Serializable 
    private static final long serialVersionUID = 565662170056829238L;

    // invoked when user tries to access a secured REST resource without supplying any credentials,
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException 
        // send a json object, with http code 401,
        // response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");

        // redirect to login page, for non-ajax request,
        response.sendRedirect("/login.html");
    

在安全配置类中(例如WebSecurityConfig):

自动装配 bean:

@Autowired
private CommenceEntryPoint unauthorizedHandler; // handle unauthorized request,

指定处理程序:

.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() // excepion handler,

提示:

这仅适用于非ajax请求, ajax请求最好返回401代码,让前端处理。 如果您想使用401 响应,请在CommenceEntryPoint.commence() 中使用response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); 而不是response.sendRedirect()

【讨论】:

您不需要创建自己的组件。相反,您可以使用:.exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/"))

以上是关于Spring Security:在 401 的情况下重定向到登录页面的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot / Spring Security中的错误401未经授权

Spring Security 返回 200 而不是 HttpWebHandlerAdapter 所述的 401

尽管 authorizeRequests().anyRequest().permitAll() spring-security 返回 401

Spring-Security:使用 CORS Preflights 获得 401(尽管 http.cors())

Spring-Security:AuthenticationManager 抛出 BadCredentialsException 时返回状态 401

spring security 用户名密码错误返回401页面