Spring Security 5身份验证始终返回302

时间:2018-05-03 14:48:07

标签: spring spring-mvc spring-security

我正在使用Spring-Security 5来保护我的网络应用。我访问/login.jsp并填写用户名和密码,然后单击“登录”以提交表单,然后重定向到/login.jsp。我看到fiddler中http流量的响应状态代码是302.我知道验证失败将返回302,但密码和用户名是正确的。

SecurityConfig类:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private DataSource dataSource;

    @Autowired
    protected SecurityConfig(DataSource dataSource
    ) {
        this.dataSource = dataSource;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login.jsp")
                .loginProcessingUrl("/login")
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication()
                .dataSource(dataSource)
                .usersByUsernameQuery("select name userName, password, enabled from user where name=?")
                .authoritiesByUsernameQuery("select name userName 'ROLE_USER' from user where name=?")
        ;
    }
}

用户表(mysql):

enter image description here

的login.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c"
           uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<c:url value="/login" var="loginUrl"/>
<form action="${loginUrl}" method="post"> 1
    <c:if test="${param.error != null}"> 2
        <p>
            Invalid username and password.
        </p>
    </c:if>
    <c:if test="${param.logout != null}"> 3
        <p>
            You have been logged out.
        </p>
    </c:if>
    <p>
        <label for="username">Username</label>
        <input type="text" id="username" name="username"/> 4
    </p>
    <p>
        <label for="password">Password</label>
        <input type="password" id="password" name="password"/> 5
    </p>
    <button type="submit" class="btn">Log in</button>
</form>
</body>
</html>

5 个答案:

答案 0 :(得分:0)

使用successHandler将referer设置为true。这对我来说很有用。另外我也得到302。

在securityConfig中需要添加以下代码。

@Override
protected void configure(HttpSecurity http) throws Exception {
http
  .authorizeRequests()
  .antMatchers("/login*")
  .permitAll()
  .anyRequest()
  .authenticated()
  .and()
  .formLogin()
  .successHandler(new RefererRedirectionAuthenticationSuccessHandler ());
}


import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;

public class RefererRedirectionAuthenticationSuccessHandler extends 
SimpleUrlAuthenticationSuccessHandler
    implements AuthenticationSuccessHandler {

public RefererRedirectionAuthenticationSuccessHandler() {
    super();
    setUseReferer(true);
}

}

}

检查以下链接: http://www.baeldung.com/spring-security-redirect-login

答案 1 :(得分:0)

我遇到了这个问题,直到我通过在.csrf().disable()方法中包含configure (HttpSecurity)来关闭csrf检查为止。 如果没有关闭,请提供csrf令牌作为隐藏表单字段。

...尽管我看到您已禁用它

答案 2 :(得分:0)

这是因为spring默认身份验证成功处理程序正在寻找要重定向的网址。 一个人可以做的是使用自定义AuthenticationSuccessHandler

我在下面使用过,没有重定向发生。

public class AppAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler{
    protected void handle(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) throws IOException, ServletException {
    }

}

然后定义bean并在configure方法中提供安全性

@Bean
public AuthenticationSuccessHandler appAuthenticationSuccessHandler(){
     return new AppAuthenticationSuccessHandler();
}

配置方法

http
  .authorizeRequests()
  .antMatchers("/login*")
  .permitAll()
  .anyRequest()
  .authenticated()
  .and()
  .formLogin()
  .successHandler(new appAuthenticationSuccessHandler());

答案 3 :(得分:0)

我不知道此问题是否始终有效,但是是否可以帮助某人...

对我有用的是替换

.formLogin()

作者

.httpBasic();

在我的 WebSecurityConfigurerAdapter 类中。

所以我的安全配置如下:

protected void configure(final HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/login", "/actuator/**", "/clients/refresh", "/oauth/token/revokeById/**", "/tokens/**")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .httpBasic();
}

答案 4 :(得分:0)

  • “登录页面网址”与“表单操作”相同
  • 显示代码

java 配置:

http.formLogin().loginPage("/login.html")

html

<form action="/login.html" method="post"> 

你只需要为“/login.html”编写控制器,通过http GET方法,剩下的交给“spring”

<块引用>

文档:https://docs.spring.io/spring-security/site/docs/5.3.6.RELEASE/reference/html5/#servlet-authentication-form

UsernamePasswordAuthenticationFilter 匹配 /login.htmlhttp POST method

我的英文不好,希望能帮到你