【问题标题】:Spring Security in a multi module Maven project (where to put DB auth, UserDetails, etc.?)多模块 Maven 项目中的 Spring Security(将 DB auth、UserDetails 等放在哪里?)
【发布时间】:2013-07-23 06:22:25
【问题描述】:

目前我们有 6 个 Maven 模块:

  • webapp
  • security
  • core(提供对User的数据库访问)
  • common
  • module1
  • module2

我认为依赖树非常明显:

  • webapp 取决于一切
  • security 依赖核心
  • core 取决于共同点
  • common 不依赖任何东西
  • module1 依赖于core和common
  • module2 依赖于 core、module1 和 common

现在我想要一些BaseEntity:它应该有一个@PrePersist,它保存了当前的User。几乎每个实体都会使用这个BaseEntity。这就是为什么每个模块都依赖于core

因为一切都依赖于core,所以将这个BaseEntity 也放在core 模块中似乎是合乎逻辑的。 (即使我更愿意为此使用common,但由于依赖关系,这似乎是不可能的)。

现在问题出现了:要设置当前用户,我必须使用访问SecurityContextHolder.getContext().getAuthentication().getPrincipal()。但是有了这个我会有一些不必要的依赖(或者我太吹毛求疵了?)。

如果我想要自定义实现UserDetails,问题会变得更糟。我应该把它放在哪里? core 还是 security?还是让User 实体实现UserDetails 很常见?我不这么认为。问题出现了,因为在验证用户身份时,我必须在 security 模块内创建 UserDetails 对象。当我想检索当前的User 时,我必须将getPrincipal() 方法转换为自定义UserDetails 类。

我真的很困惑如何让事物保持松散耦合,但又要实现应用程序所需的一切。

我想到的最后一个想法是关于使用依赖注入,但我不知道它是否有效!? (在security 模块中有一个currentUser Bean,其他人可以通过@Autowired MyCustomUserDetails 简单地获取它)

所以请帮我把这些事情做好!

谢谢! :)

【问题讨论】:

  • 嗨,本杰明,如果您能够以某种方式实现这一目标,您能否提供任何见解。对很多人都有帮助,因为它似乎仍然是许多人面临的一个活跃问题,但没有找到解决方案。

标签: spring maven spring-security dependencies multi-module


【解决方案1】:

首先,通过将@PrePersist 方法放在单独的监听类。为避免将@EntityListeners 注释添加到实体类(并因此添加依赖项),您可以通过 XML 配置侦听器。见this answer

其次,将依赖项注入实体侦听器似乎很麻烦,正如here 所解释的那样。因此,我只会坚持

SecurityContextHolder.getContext().getAuthentication().getPrincipal()

由于这段代码可以在security 模块中,我认为这没什么大不了的。如果您担心转换为UserDetails,您可以改为调用getAuthentication().getName(),它直接返回主体名称(如果可用)并使用它在数据库中查找当前用户。

最后,关于让User实现UserDetails:当然,这样做会再次增加对Spring Security的依赖,所以如果你想避免这种情况,那就不要这样做。否则,我看不出它有任何重大问题,除了在你的类中有你可能不需要的方法(isAccountNonExpiredisAccountNonLocked...)并且在检索主体时需要强制转换为User。好处是您不需要先从数据库中检索用户。

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 2020-09-02
    • 2019-06-26
    • 1970-01-01
    • 2015-10-10
    • 2013-12-15
    • 2010-12-06
    • 2017-06-01
    • 2015-01-26
    相关资源
    最近更新 更多