2013-02-12 57 views
11
  1. 有哪些优势获得本金如春控制器参数Principal principal,然后把它传递给服务层之上,虽然SecurityContextHolder.getContext().getAuthentication().getPrincipal()在服务层立即获得本金?
  2. 什么是在没有检查getAuthentication()getPrincipal()对象的情况下在服务层获取主要细节的最佳方法(类似于自定义包装器)?
+1

你可能会找到[这个问题]的答案(http://stackoverflow.com/questions/248562/when-using-spring-security-what-is-the-proper-way-to-obtain- current-username-i)有用。 [这个答案](http://stackoverflow.com/questions/8764545/best-practice-for-getting-active-users-userdetails/8765597#8765597)也可能有用。 – 2013-02-13 14:13:34

+0

这是一个很好的解决方案,让抽象类与静态方法,我可以把'SecurityContextHolder.getContext()。getAuthentication()。getPrincipal()'?之后,我可以在服务层中使用它。 – Alex 2013-02-14 00:40:24

+0

阅读我给你的第二个链接。没有什么可以阻止你在你的服务中使用这种方法,并且如果你使用一个接口,你也可以将它交换出来进行测试。 – 2013-02-14 01:59:29

回答

9
    • 您的服务API将更加易于使用。您将直接看到对主体的依赖关系,因此您不会在主体不存在的环境中错误地调用某种服务方法。
    • 通常,对SpringSecurity代码的较少依赖意味着在迁移到新的Spring Security版本时,问题较少。
    • 您将能够在Spring Security不存在的环境中重用您的服务层。
  1. 准备一些包装类(例如AuthenticationService)。将getPrincipal()方法添加到它。实施你的支票。将AuthenticationService直接调用到SecurityContextHolder的任何地方。
+0

如果我需要为特定用户获取一些数据,我认为在服务层获得一个主体(例如用户名)更安全,因为此(限制)和数据库之间的层数较少。所以这是唯一的道,而不是在控制器中获得委托人(其间的附加服务层)。但另一方面,正如你所说的,服务层可以更加可重用。你对此有何看法? – Alex 2013-02-13 00:32:53

+1

主要对象由web层保存并保留。所以对我来说,委托人从控制器到服务层看起来很自然。还有一点是静态依赖对单元测试不利:http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/。我没有看到任何安全问题,因为一个pincipal实例是不可变的(通常密码在这个时候将从实际实现中被擦除)。不好意思推迟了。我很长时间是AFK。 – 2013-02-27 18:08:40

+0

在扩展BaseService(服务层)中使用您的选项2是否安全? – Alex 2013-03-07 12:40:19

相关问题