当前位置: 首页 > 知识库问答 >
问题:

如何获取getUserPrincipal()。在实现Spring数据JPA AuditorAware接口时使用getUserName()

毋玺
2023-03-14

我试图在我当前的项目中使用Spring数据JPA(1.6.2)。一切似乎都很好,但我在实现AuditorAware接口时遇到了问题。

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

  1. Struts 1.2.4(带Struts入口桥)

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

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

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

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

共有1个答案

马奇略
2023-03-14

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

要保留Spring的命名,请将其称为Prinda alContextHolder。作为起点,您可以查看JodaTimeContextHolder的源代码以获取ContextHolder的简单实现。

 类似资料:
  • 问题现象 页面生命周期相关问题,在页面渲染前从接口获取数据,渲染时将数据渲染到页面上。

  • 我是说 现在我可以得到这个房间的孩子了,但是我想知道是否有一种方法可以使用来完成同样的事情。

  • 问题内容: 作为Java开发人员,我经常需要在接口的不同实现之间进行选择。有时, 一次 只能进行 一次 选择,而另一些时候,我需要不同的实现来响应程序收到的不同输入。换句话说,我需要能够在运行时 更改 实现。这可以通过一个帮助器对象轻松实现,该对象将一些键(基于用户输入)转换为对适当接口实现的引用。 使用Spring,我可以将这样的对象设计为Bean,然后将其注入到需要的地方: 现在,我应该如何实

  • 问题内容: 如何获得在Spring中实现特定通用接口(例如Filter >)的所有bean的引用? 这是我希望以最少的行数实现的目标: 我当前的实现使用反射来确定filter.approve在调用事件之前是否确实接受该事件。例如 dosFilterAcceptEventAsArgument在哪里做所有我想摆脱的丑陋工作。有什么建议? 问题答案: 如果您的问题是“ Spring是否有更好的方法来做到

  • 我有一个重要的问题: null 这是一个简单的4步过程: 定义属性 定义您的实体 定义扩展CrudRepository和的接口 使用该接口 但是在使用两个数据库的情况下,有一个5。必须定义类的步骤。 您也可以在一门课上同时上两门课,但我是这样做的: db1config.java java db2config.java 谢谢你的帮助。

  • 问题内容: 我有这个界面: 并实现该类: 在此案例中,parameter是,这是的具体实现。如何使用反射获得此效果? 问题答案: 通过通用接口解析类型。例如 PS:请记住acutalTypeArguments是type 。他们一定不是一个。在您的情况下,它是一个Class,因为您的类型定义是。