我已经在帖子中挖掘了太久并且头晕目眩,所以我希望这里的一位大师可以帮助我解决这个问题。
我正在使用容器管理的身份验证,它运行良好。我有我的 Realm 设置来进行身份验证,在 web.xml 中设置受保护的 url,有一个登录页面等。
但现在我遇到了一个问题......
我的数据模型有 JPA 对象,其中一些对象经过“审核”,因为它们跟踪它们的创建或更新时间以及由谁创建或更新。
我@PrePersist
在我的代码中使用一个处理程序来分别设置持久/更新的createdOn
和字段,如下所示:updatedOn
@PrePersist
protected void onCreate() {
this.setCreatedOn(new Date());
}
这很好用,但我错过了如何从这里访问当前登录的用户......我需要它才能设置该createdBy
字段。
我正在使用Resteasy并且在我的端点中我确实可以访问登录的用户名并且能够获取我的 Account 对象:
@Path("/test")
public class TestEndpoint {
@EJB
AuthorizationService authService;
@GET
@Path("path")
@Produces("application/json")
@RolesAllowed("User")
public Response test() {
Account account = authService.getLoggedInAccount();
return account == null ? Response.status(Status.NOT_FOUND).build() : Response.ok().entity(account).build();
}
}
AuthorizationService 是我的,看起来像这样:
@Stateless
@LocalBean
public class AuthorizationService {
@Inject
HttpServletRequest request;
public Account getLoggedInAccount() {
Account result = (Account) request.getAttribute(LOGGED_IN_USER);
if (result == null) {
Principal principal = request.getUserPrincipal();
if (principal != null) {
List<Account> results = crudService.find(Account.BY_NAME, Params.of("name", principal.getName()), 0, 0);
if (results != null && results.size() > 0) {
result = results.get(0);
request.setAttribute(LOGGED_IN_USER, result);
}
}
}
return result;
}
}
这行得通。请注意,我将登录用户缓存在请求属性上,因此我不会每次都将查询发送到数据库。
到目前为止,我已经能够通过这个设置,但我觉得我做这一切都错了......
我想有一个全局拦截点(过滤器?),我用当前登录的用户的 Account 对象填充......某物......(请求?)然后能够在需要的地方注入它......我我会非常喜欢不创建会话的解决方案,因为我正在尝试使应用程序尽可能可扩展。
有关如何处理此问题的任何提示?可能很好地解释了这一点的教程的黄金链接?感谢您的帮助!