我正在尝试在我当前的项目中使用Spring Data JPA(1.6.2)。一切似乎都运行良好,但在实现AuditorAware界面时我遇到了困难。
我的应用程序将部署到旧的Apache Jetspeed JSR168兼容门户。此门户负责用户身份验证/授权。因此,我不必使用像Spring Security或Shiro这样的安全框架。我的应用程序中的其他框架是:
我想在我的实体中使用@CreatedBy和@LastModifiedBy注释字段(我得到@CreatedDate和@LastModifiedDate工作)。在我的应用程序中,我通常使用 request.getUserPrincipal()。getUserName()获取用户名。
但是如何在实现AuditorAware界面时获取用户名?
Spring Data JPA docs的示例实现:
class SpringSecurityAuditorAware implements AuditorAware<User> {
public User getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated()) {
return null;
}
return ((MyUserDetails) authentication.getPrincipal()).getUser();
}
}
不知怎的,我想像这样实现AuditorAware:
class MyAuditorAware implements AuditorAware<String> {
public String getCurrentAuditor() {
return <<principal from servlet- or portletcontext>>.getUserName();
}
}
如何在不添加额外框架的情况下实现此目标?
答案 0 :(得分:1)
正如康斯坦丁在评论中已经提到的那样,您可能希望将主体名称保存在适合请求的范围内。这可能是ThreadLocal
。这使您可以稍后在AuditorAware
实施中轻松获取它。
继续使用Spring的命名称为PrincipalContextHolder
。作为起点,您可以查看JodaTimeContextHolder的来源,了解ContextHolder
的简单实现。