在Spring REST应用中成功进行身份验证后,为什么Principal为null?

时间:2019-04-20 15:41:10

标签: java spring spring-boot spring-security

我现在正在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));

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我可以想到两种选择:

第一个选项:

将使用为您提供弹簧的“记住我”功能以及JSESSIONID cookie管理功能,在这里给您留下一个很好的说明并且非常简单的教程:

https://www.baeldung.com/spring-security-remember-me

第二个选项:

使用OAuth2,就像您在评论中所说的那样,但实现起来会贵一些,需要更多的依赖关系,需要第三方验证令牌并且配置更长。

以下是指南:

https://www.baeldung.com/rest-api-spring-oauth2-angular