简体   繁体   English

当使用 Quarkus rest 数据 Panache 如何在 @PrePersist 中从请求 header 访问用户名

[英]When using Quarkus rest data Panache how to access username from request header in @PrePersist

I am trying to log the user that modified the entity.我正在尝试记录修改实体的用户。 The reverse proxy is setting the user name in the request header.反向代理在请求 header 中设置用户名。

How can the request and headers be read from an independent class when rest Panache is used to expose JAX-RS CRUD当使用 rest Panache 公开 JAX-RS CRUD 时,如何从独立的 class 读取请求和标头

below an example of what I tried but I am getting null or null pointer exep下面是我尝试过的示例,但我得到 null 或 null 指针 exep

package org.acme.manrest;

import javax.enterprise.context.RequestScoped;
import javax.persistence.PrePersist;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;

import org.acme.jpa.TBusiness;
import org.jboss.logging.Logger;

@RequestScoped
public class HeaderValue {
  private static final Logger LOG = Logger.getLogger(HeaderValue.class);

  @Context
  HttpServletRequest request;

  public HttpServletRequest getRequest() {
    return request;
  }

  @Context
  HttpHeaders httpHeaders;

  @HeaderParam("x-remote-user")
  String userName;

  public String getUserName() {
    LOG.info("xxx: " + getRequest().getHeader("x-remote-user"));
    LOG.info("userName: " + userName);
    LOG.info("getUserName2: " + getUserName2());
    LOG.info("getUserName3: " + getUserName3());
    return userName;
  }

  public String getUserName2() {
    return httpHeaders.getRequestHeader("x-remote-user").get(0);
  }

  public String getUserName3() {
    LOG.info("getUserName from class " + request.getHeader("x-remote-user"));
    return request.getHeader("x-remote-user");
  }

  @PrePersist
  void onPrePersist(TBusiness myEntity) {
    LOG.info("getUserName: " + userName);

    myEntity.createdBy = userName;
    myEntity.updatedBy = userName;
  }

}

Could switching to JWT and using JWT RBAC in Quarkus be a workaround?在 Quarkus 中切换到 JWT 并使用 JWT RBAC 是否可以解决?

got this to work by adding undertow dependency:通过添加 undertow 依赖项使其工作:

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-undertow</artifactId>
    </dependency>

then in an EntityListener class created below PrePersist method:然后在PrePersist方法下创建的EntityListener class 中:

@RequestScoped
// @Path("api/v1/Header")
public class AuditingEntityListener {
  private static final Logger LOG = Logger.getLogger(AuditingEntityListener.class);

  // Inject the bean so that Quarkus does not remove it at build time (IMPORTANT)
  @Inject
  HttpServletRequest requestNotUsed;

  @PrePersist
  void onPrePersist(TBusiness myEntity) {
    HttpServletRequest HSR = CDI.current().select(HttpServletRequest.class).get();
    LOG.info("HSR getRequestHeader user: " + HSR.getHeader("x-remote-user"));
  }
}

using JWT RBAC in Quarkus also works:在 Quarkus 中使用 JWT RBAC 也可以:

  @PrePersist
  void onPrePersist(TBusiness myEntity) {
    JsonWebToken context = CDI.current().select(JsonWebToken.class).get();
    LOG.info("context: " + context.getClaim("preferred_username"));
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从 websocket 端点访问反应式华丽实体 Session 管理器? (夸库斯,叛变,华丽,反应) - How to access reactive Panache Entity Session Manager from a websocket endpoint? (Quarkus, Mutiny, Panache, Reactive) 使用 Panache 和 Quarkus 对 MongoDB 文档进行排序 - Sort MongoDB document using Panache and Quarkus 如何使用 Quarkus 以两种方式 SSL 从 REST 服务中的请求中检索客户端证书 - How to retrieve the client certificate from a request in a REST service using Quarkus in two way SSL 如何使用 Quarkus Panache 在 select 查询中使用 LocalTime - How to use LocalTime in select query with Quarkus Panache 如何使用 select 仅使用 Quarkus Panache 的某些字段? - How to select only certain fields with Quarkus Panache? 为什么在使用带有 quarkus panache 的惰性获取时向下转换会引发异常? - Why down-casting throws an exception when using lazy fetch with quarkus panache? 从 EventBus @ConsumeEvent 调用时,Quarkus Panache Repository 调用以静默方式失败 - Quarkus Panache Repository call silently fails when called from an EventBus @ConsumeEvent Quarkus Panache 实体上的 JAXB 注释导致 REST 调用失败 - JAXB annotations on a Quarkus Panache entity causes REST call to fail Quarkus REST API with Hibernate/Panache - 端点查询 Postgres 存储过程 - Quarkus REST API with Hibernate/Panache - Endpoints querying Postgres Stored Procedure 如何使用片段中的数据更改导航标题中的用户名? - How to change username in navigation header using data from fragment?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM