以编程方式登录Spring Security并在AngularJS上进行身份验证(JHipster)

时间:2017-04-06 07:57:12

标签: angularjs spring authentication spring-security jhipster

我需要在从浏览器发出常规GET请求后对JHipster(Spring Security / AngularJS)用户进行身份验证,然后重定向到AngularJS应用程序(用于OpenID身份验证)

@GetMapping("/login")
@Timed
public void login(HttpServletResponse response) throws Exception {
    User user = userRepository.findOneByLogin("user").get(); // For testing purposes
    Authentication auth = new UsernamePasswordAuthenticationToken(user, null);
    SecurityContextHolder.getContext().setAuthentication(auth);

    response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
    response.setHeader("Location", "http://localhost:8080/#/");
}

重定向到" http://localhost:8080/#/"如果做了,响应标题附带了一个JSESSIONID,但我不知道这是否是我需要的令牌(这是"用户"经过身份验证的令牌?),并且它没有& #39;坚持浏览器cookie(可能是因为重定向?)

如果我使用默认的JHipster AngularJS用户名/密码表单登录,则响应标头随附

Set-Cookie:XSRF-TOKEN=108cadcf-2005-4e36-b055-438d75dc1ce9; path=/
Set-Cookie:JSESSIONID=foVcxycPQbUgS6nviKG1ftXSIgnlgDJdtxEGCSGZ; path=/; HttpOnly
Set-Cookie:remember-me=N2pNMGFRRGJENldhZWpQTGV2d1k6c3NOTkk1WWpnR28xcWRldDE2T3U; path=/; HttpOnly; Max-Age=2678400; Expires=Sun, 07-May-2017 07:40:16 GMT

认为这里的解决方案是以编程方式登录用户,获取有效的JSESSIONID令牌,并在使用位置标头重定向后/在浏览器中将其设置为cookie,但我和这些步骤有问题。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

实际上,这条线并没有真正验证我想要的方式:

Authentication auth = new UsernamePasswordAuthenticationToken(user, null);

正在设置JSESSIONID,但在请求身份验证失败后,它正在被销毁。

我改为:

Authentication auth = new UsernamePasswordAuthenticationToken(user, null, new ArrayList<GrantedAuthority>());

通过使用不同的构造函数,它现在正确进行身份验证。

答案 1 :(得分:0)

JHipster提供开箱即用的OpenID身份验证(称为“社交登录”),它比“常规GET请求”复杂得多,因此最好的解决方案可能是从现有模板开始,而不是自己制作模板。

接下来,'JSESSIONID'cookie和请求参数不受JHipster或Spring Security控制/创建/修改,这是在容器级别,servlet规范的一部分,完全由servlet容器控制,内部使用(其中一个案例)实例化/获取会话bean。你不应该试图覆盖它们。