我们有一个可以正常使用的后端登录POST服务,该服务使用Spring Security以及Spring Boot和Spring Session来实现。用户需要登录才能访问其他服务。登录操作有效,限制/允许访问其他服务的机制也有效。 Postman已对其进行了测试,它足够“聪明”,可以在后续请求中保留会话cookie。
现在,我们正在尝试在React上构建客户端。使用浏览器的调试时,我们可以看到会话cookie在响应头中发送,没有问题。我们试图从标头中获取会话cookie并将其存储为后续请求,但它不起作用。在调查中,我们了解到我们无意从代码中读取响应标头,如here和here所述。
我们的登录操作应重定向到/ 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)
}
}
答案 0 :(得分:0)
使用JWT(Jason Web令牌)是在像React这样的单页面应用程序上实现安全性的好方法。
如果您要使用JWT方法,则使用axios之类的包来处理来自客户端的http请求将非常有效。 Axios允许您轻松地将授权令牌添加到所有请求中,而无需麻烦。
即使您不使用JWT,也请尝试使用axios有效地发送授权令牌。