2

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

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

  1. Struts 1.2.4(带有 Struts-Portal-Bridge)
  2. 春季 3.2.10
  3. JPA(Hibernate 3.6.10 作为 ORM 提供者)

我想在我的实体中使用 @CreatedBy 和 @LastModifiedBy 注释字段(我得到了 @CreatedDate 和 @LastModifiedDate 工作)。在我的应用程序中,我通常使用request.getUserPrincipal().getUserName()获取用户名。

但是在实现 AuditorAware 接口时如何获取用户名呢?

Spring Data JPA 文档中的示例实现:

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();
    }
}

如何在不添加额外框架的情况下完成此操作?

4

1 回答 1

1

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

为了保持 Spring 的命名,请调用它PrincipalContextHolder。作为起点,您可以查看JodaTimeContextHolder的源代码,了解ContextHolder.

于 2014-08-24T10:21:03.220 回答