我现在正在Spring Rest应用程序中实现身份验证,因此我从Electron.js应用程序发送了一个请求,Spring处理了所有事情。
现在,如果我通过浏览器登录,它将保存我的对象并成功返回Principal。但是,如果我登录并尝试通过Electron.js应用发送请求以返回该Principal的请求,它将引发NullException。
@GetMapping("/user")
public String user(Principal principal)
{
return principal.getName(); // null via rest app (electron app), not null via browser (authenticated)
}
@GetMapping("/loginRequest") // this is method that requires user's credentials
public UserModel login(Principal principal)
{
return userDAO.findByUsername(principal.getName()); // signs in on both (browser and rest app), returns json object
}
配置看起来是这样的:
@Autowired
private MongoUserDetailsService userDetailsService;
@Override
public void configure(HttpSecurity http) throws Exception
{
http.cors().and()
.csrf().disable()
.authorizeRequests()
.antMatchers("/loginRequest").authenticated()
.and()
.httpBasic();
}
@Override
public void configure(AuthenticationManagerBuilder builder) throws Exception
{
builder.userDetailsService(userDetailsService);
}
@Bean
public PasswordEncoder passwordEncoder()
{
return new BCryptPasswordEncoder();
}
Electron.js的请求
axios(API + 'loginRequest', {
method: 'GET',
auth: {
username: this.username, // Both username & pass are taken from fields
password: this.password
}
})
.then(response => {
this.userObject = response.data;
}).catch(err => this.showError('Username or password is invalid', 2));
提前谢谢!
答案 0 :(得分:0)
我可以想到两种选择:
第一个选项:
将使用为您提供弹簧的“记住我”功能以及JSESSIONID cookie管理功能,在这里给您留下一个很好的说明并且非常简单的教程:
https://www.baeldung.com/spring-security-remember-me
第二个选项:
使用OAuth2,就像您在评论中所说的那样,但实现起来会贵一些,需要更多的依赖关系,需要第三方验证令牌并且配置更长。
以下是指南: