使用Spring Security进行基于客户端Cookie的身份验证

时间:2019-01-18 20:10:24

标签: reactjs rest cookies login spring-session

我们有一个可以正常使用的后端登录POST服务,该服务使用Spring Security以及Spring Boot和Spring Session来实现。用户需要登录才能访问其他服务。登录操作有效,限制/允许访问其他服务的机制也有效。 Postman已对其进行了测试,它足够“聪明”,可以在后续请求中保留会话cookie。

现在,我们正在尝试在React上构建客户端。使用浏览器的调试时,我们可以看到会话cookie在响应头中发送,没有问题。我们试图从标头中获取会话cookie并将其存储为后续请求,但它不起作用。在调查中,我们了解到我们无意从代码中读取响应标头,如herehere所述。

我们的登录操作应重定向到/ customer / home,这在Postman中有效,但在我们的应用程序中无效。我们得到的行为是403禁止,并且我们评估它的方式是因为重定向时未设置cookie,因此第二个操作(GET / customer / home)失败并返回403。我们的理解正确吗?但是,浏览器似乎并没有自动保留会话cookie。如果未自动设置cookie,并且不应该手动读取它,我们应该如何维护后续请求的会话?我们是否应该为此目的不使用cookie,而是发出身份验证令牌?

我们显然是误会或遗漏了一些东西。有指针吗?

我们的WebSecurityConfigurerAdapter:

@EnableWebSecurity
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private AuthenticationProviderService authenticationProviderService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .antMatchers("/customer/register").permitAll()
                    .anyRequest().fullyAuthenticated()
                    .and()
                .formLogin()
                    .permitAll()
                    .defaultSuccessUrl("/customer/home", false)
                    .and()
                .logout()
                    .permitAll()
                    .and()
                .httpBasic();
        http.csrf().disable();
    }
//[ . . . ]
}

我们的客户尝试执行POST:

const mw = store => next => action => {

  if(action.type == 'SUBMIT_LOGIN_USER') {

    var payload = {
      username: action.user.username,
      password: action.user.password
    };

      // Build formData object.
    let formData = new FormData();
    formData.append('username', action.user.username);
    formData.append('password', action.user.password);


    return fetch('http://192.168.0.34:8080/login', {
      method: 'POST',
      body: formData
    }).then(
      r => (r)
    )
    .then(function(response) {
      console.log(document.cookie) //empty
      console.log(response.headers.get('Set-Cookie')) //null
      next(action)
    })
    .catch(function(err) {
      console.info(err);
    });
  } else {
    next(action)
  }
}

1 个答案:

答案 0 :(得分:0)

使用JWT(Jason Web令牌)是在像React这样的单页面应用程序上实现安全性的好方法。

如果您要使用JWT方法,则使用axios之类的包来处理来自客户端的http请求将非常有效。 Axios允许您轻松地将授权令牌添加到所有请求中,而无需麻烦。

即使您不使用JWT,也请尝试使用axios有效地发送授权令牌。