多模块Maven项目中的Spring Security(在哪里放置DB auth,UserDetails等?)

Ben*_*n M 8 spring dependencies spring-security maven multi-module

目前我们有6个Maven模块:

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

我认为依赖树非常明显:

  • webapp 取决于一切
  • security 取决于核心
  • core 取决于共同点
  • common 什么都不依赖
  • module1 取决于核心和共同点
  • module2 取决于核心,module1和common

现在我想要一些BaseEntity:它应该有一个@PrePersist可以节省电流User.几乎每个实体都会使用它BaseEntity.这就是每个模块依赖的原因core.

而且因为一切都依赖于core,将这BaseEntity也放在core模块中似乎是合乎逻辑的.(即使我更喜欢使用common它,但由于依赖性,这似乎是不可能的).

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

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

我真的很困惑如何松散耦合,但也实现了应用程序所需的一切.

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

所以请帮我把这些东西弄好!

谢谢! :)

rol*_*lve 0

首先,通过将方法放入单独的侦听器类中,可以将当前用户注入的代码放入BaseEntity不同的模块(该core模块不依赖)中。为了避免向实体类@PrePersist添加注释(并因此添加依赖项),您可以通过 XML 配置侦听器。@EntityListeners看到这个答案

其次,将依赖项注入到实体侦听器中似乎相当麻烦,如此处所述。因此,我只会坚持

SecurityContextHolder.getContext().getAuthentication().getPrincipal()
Run Code Online (Sandbox Code Playgroud)

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

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