如何在实现Spring Data JPA AuditorAware接口时获取getUserPrincipal()。getUserName()

时间:2014-08-24 09:13:25

标签: spring authentication spring-data spring-data-jpa jetspeed2

我正在尝试在我当前的项目中使用Spring Data JPA(1.6.2)。一切似乎都运行良好,但在实现AuditorAware界面时我遇到了困难。

我的应用程序将部署到旧的Apache Jetspeed JSR168兼容门户。此门户负责用户身份验证/授权。因此,我不必使用像Spring Security或Shiro这样的安全框架。我的应用程序中的其他框架是:

  1. Struts 1.2.4(带有Struts-Portal-Bridge)
  2. Spring 3.2.10
  3. JPA(Hibernate 3.6.10作为ORM提供商)
  4. 我想在我的实体中使用@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();
        }
    }
    

    如何在不添加额外框架的情况下实现此目标?

1 个答案:

答案 0 :(得分:1)

正如康斯坦丁在评论中已经提到的那样,您可能希望将主体名称保存在适合请求的范围内。这可能是ThreadLocal。这使您可以稍后在AuditorAware实施中轻松获取它。

继续使用Spring的命名称为PrincipalContextHolder。作为起点,您可以查看JodaTimeContextHolder的来源,了解ContextHolder的简单实现。