Ben*_*n M 8 spring dependencies spring-security maven multi-module
目前我们有6个Maven模块:
webappsecuritycore(提供数据库访问User)commonmodule1module2我认为依赖树非常明显:
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是否常见?我不这么认为.问题出现了,因为在验证用户时,我必须UserDetails在security模块内创建对象.当我想要检索当前时,User我必须将getPrincipal()方法强制转换为自定义UserDetails类.
我真的很困惑如何松散耦合,但也实现了应用程序所需的一切.
我想到的最后一个想法是关于使用依赖注入,但我不知道它是否有效!?(在模块中有一个currentUserBean security,其他人都可以通过它获得它@Autowired MyCustomUserDetails)
所以请帮我把这些东西弄好!
谢谢! :)
首先,通过将方法放入单独的侦听器类中,可以将当前用户注入的代码放入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优点是您不需要先从数据库检索用户。
| 归档时间: |
|
| 查看次数: |
960 次 |
| 最近记录: |