JHipster获得当前用户

时间:2017-08-19 08:51:14

标签: spring angular spring-security spring-data-jpa jhipster

我正在开发一个JHipster应用程序,我有一个与用户有多对一关系的研究实体(所以一个用户可以有很多研究)。我正在尝试更改对话框组件中的用户选择以创建新的Study以自动选择当前登录的用户。

我已经更改了select,因此只有单个用户才会显示为select的选项,修复此问题后我会禁用该字段或将其删除,以便 study.user 是自动设置:

<select class="form-control" id="field_user" name="user [(ngModel)]="study.user" > 
    <option [ngValue]="user.id === study.user?.id ? study.user : user">{{user.login}}</option> 
</select>

但是查询了userService:

this.userService.query() 
    .subscribe((res: ResponseWrapper) => { this.user = res.json; }, (res: ResponseWrapper) => this.onError(res.json)); 

将此查询运行到user.service.ts中的api:

private resourceUrl = 'api/users';
...
query(req?: any): Observable<ResponseWrapper> {
    const options = createRequestOption(req);
    return this.http.get(this.resourceUrl, options)
        .map((res: Response) => this.convertResponse(res));
}

UserResource.java中的GET方法:

@GetMapping("/users")
@Timed
public ResponseEntity<UserDTO> getAllUsers() {
    return ResponseUtil.wrapOrNotFound(
        userService.getAllManagedUsers()
            .map(UserDTO::new));
}

在UserService.java中调用此方法:

@Transactional(readOnly = true)
public Optional<User> getAllManagedUsers() {
    return userRepository.findOneByLogin(SecurityUtils.getCurrentUserLogin());
}

findOneByLogin在userRepository中定义,userRepository是User实体的Spring Data JPA存储库。

我的问题是,当我尝试从我的实体访问用户对象时,它是未定义的,抛出错误,例如:

  

错误类型错误:无法读取未定义的属性“id”

2 个答案:

答案 0 :(得分:3)

如果我理解正确,你有一个与用户有关系的研究,当你检索一个研究对象时:study在你的角度代码问题中未定义。

您不能信任角度代码,因此在创建Study时用户选择不能在客户端中,因此您应该在StudyMapper中忽略它(假设您使用DTO)或者StudyService应该覆盖它。

JHipster创建适用于管理员的视图和API。在您的情况下,您希望为只允许管理自己的研究的简单用户构建API,如果您尝试在同一个类中解决这两个用例,您的代码可能会变得混乱并且您可能会引入安全漏洞。因此,除非您想删除管理部分,否则我建议您拆分2个API和可能的视图。通过在/ api / study上研究StudyResource和/ api / user / study上的MyStudyResource,您可以通过角色以不同方式保护它们,并避免您在视图中遇到的问题,因为您将拥有明确定义的上下文而不是if /然后/全部一轮。

这样做的另一个原因是使用jhipster upgrade命令更容易升级JHipster生成的代码。

JHipster不会设计您的API,因为它确实了解您的业务领域。它为您提供了一个CRUD接口,可以从技术角度管理REST API和实体上方的数据。这就是为什么它为每个实体映射一个资源而不是聚合,这是您在使用DDD分析业务域时最终得到的。聚合在性能方面也更好,特别是对于移动客户端,因为最终减少了API调用。

您还可以使用https://github.com/cbornet/generator-jhipster-swagger-api-first

添加API

答案 1 :(得分:1)

我做了类似的事情: 在xxxResource.java中:

//maps.ejs
<!DOCTYPE html>
<html>

<head>
  <style>
    #map {
      height: 400px;
      width: 100%;
    }
  </style>
</head>
<title>Google Maps API</title>

<body>
  <h3>My Google Maps Demo</h3>
  <script>
    function initMap() {
      var uluru = {
        lat: <%=lat%>,
        lng: <%=lng%>
      };
      var map = new google.maps.Map(document.getElementById('map'), {
        zoom: 14,
        center: uluru
      });

      var infowindow = new google.maps.InfoWindow();
      var service = new google.maps.places.PlacesService(map);

      service.getDetails({
        placeId: <%=place_id%>
      }, function(place, status) {
        console.log(place);
        if (status === google.maps.places.PlacesServiceStatus.OK) {
          var marker = new google.maps.Marker({
            map: map,
            position: place.geometry.location
          });
          google.maps.event.addListener(marker, 'click', function() {
            infowindow.setContent(
              '<div><strong>' + place.name + '</strong><br>' +
              'Place ID: ' + place.place_id + '<br>' +
              place.formatted_address + '<br>' +
              "Rating : " + place.rating + '</div>');
            infowindow.open(map, this);
          });
        }
      });
  </script>
  <script async defer src="https://maps.googleapis.com/maps/api/js?key=<%=process.env.API_KEY%>&libraries=places&callback=initMap">
  </script>
  <div id="map"></div>

</body>

</html>

然后在 xxxRepository.save 之前添加:

 public String getCurrentUserLogin() {
        org.springframework.security.core.context.SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = securityContext.getAuthentication();
        String login = null;
        if (authentication != null)
            if (authentication.getPrincipal() instanceof UserDetails)
             login = ((UserDetails) authentication.getPrincipal()).getUsername();
            else if (authentication.getPrincipal() instanceof String)
             login = (String) authentication.getPrincipal();

        return login; 
        }

请参阅https://codefitter2.blogspot.com/2016/12/how-to-add-user-to-new-record-in.html