我正在尝试将Spring Security与自定义的Angular 2登录集成,即我的应用程序的特定端点受到Spring Security保护,尝试访问它将重定向到在Angular 2中处理的/login。目前情况下,我不知道如何执行登录并在登录后授予对后端API的访问权限。
我正在按以下方式配置Spring Security:
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.csrf().disable()
.cors().and()
.authorizeRequests()
.antMatchers("/api/someEndpoint/**")
.hasRole(ADMIN_ROLE).and().formLogin()
.loginPage("/login").and().logout();
}
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
由于我使用默认登录,一切都很顺利,但我发现自己无法创建一个可用的Angular 2登录集成。我尝试了以下Angular 2代码,但并没有成功:
login(loginDetails:Object) {
console.log(loginDetails)
const headers = new Headers({ 'Content-Type': 'application/json' });
const options = new RequestOptions({ headers: headers });
const body = JSON.stringify(loginDetails);
console.log(headers);
console.log(body);
return this.http.post(this.loginUrl, body, options)
}
据我所知,Spring Security 的默认用户名和密码变量名为 "username" 和 "password",我确信它们是在请求体中传递的。因此,当传递一些无效的用户数据,例如
{"username":"admin", "password" : "pass"}
时,应该被重定向到 /login?error 或其他类似的页面。当成功验证后,应该重定向到 /welcome 并保持已验证状态。我已经在我的数据库中定义了用户名和密码,并且我的自定义 userDetailsService 会对其进行检查。欢迎提出任何答案、评论或问题。
formLogin
需要application/x-www-form-urlencoded
类型的参数,而不是application/json
。由于你正在使用 API,因此必须使用 HTTP 基本身份验证或 OAuth2。 - WildDev