首页 > 解决方案 > jhipster 使用具有相同身份验证的 rest api 和 rest 模板

问题描述

我已经使用java(spring boot)和angular生成了一个jhipster项目,我想将angular用于管理模块,它管理站点的所有内容并在前端使用angular,在后端使用java。主页使用rest模板显示内容,我需要在管理模块和主页之间使用相同的身份验证。当我登录管理模块然后返回主页时,登录用户的名称将显示在主页中,但我无法在主页中获得登录用户的身份验证

  1. 在获取登录用户时的rest api中,我将使用 SecurityUtils.isAuthenticated() 进行如下检查
@Override
public ResponseEntity<?> getSalesProduct() {
    if (SecurityUtils.isAuthenticated()) {
        User user = userRepository.findOneByLogin(SecurityUtils.getCurrentUserLogin().get()).get();
    }
  1. 在休息模板中,我还使用 SecurityUtils.isAuthenticated() 进行检查,但结果总是错误的
@GetMapping("/profile")
public ModelAndView profile() {
     if (SecurityUtils.isAuthenticated()) {             
         User user = userRepository.findOneByLogin(SecurityUtils.getCurrentUserLogin().get());
     }

请给我一些想法如何在主页中获得身份验证。

标签: jhipster

解决方案


这里的关键点是您使用了 2 种前端技术:Angular(由 JHipster 生成的管理单页应用程序)和带有 Thymeleaf 的 Spring MVC,它们的工作方式完全不同。

您在 JHipster 中选择的 JWT 身份验证类型要求前端通过 HTTP 标头提供身份验证令牌。在生成的 Angular 应用程序中,经过身份验证后,令牌由浏览器 LocalStorage 中的 javascript 代码存储,然后 Angular 应用程序将令牌作为 HTTP 标头添加到后端的每个请求。

当浏览器请求您的 Spring MVC 主页时,没有 javascript 代码将令牌添加到请求中,因此后端说这是一个匿名请求。

您可以尝试以下两种选择之一:

  • 将您的主页编写为 Angular 应用程序,并重用生成的管理部分中的一些组件和服务
  • 使用会话身份验证类型重新生成您的应用程序,因为它使用 cookie 进行身份验证,该 cookie 由浏览器自动发送到后端

推荐阅读