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】:要在身份验证失败的情况下显示登录页面,您应该在 <access-denied-handler error-page="/login.jsp"/>
和 <intercept-url pattern="/*Login*" access="hasRole('ROLE_ANONYMOUS')"/>
中使用相同的 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 中自定义身份验证失败响应