2012-09-28 62 views
2

我正在使用spring安全@PreAuthorise来检查谁和谁不能访问我的服务层中的方法。它工作得很好。通常我的服务方式是用Spring安全@PreAuthorize(“hasAnyRole('....')”)

@PreAuthorize("hasAnyRole('MY_USER_ROLE')") 

我的问题是我有一个由多个jar文件组成的war文件。这些jar文件中的每一个都负责一段业务逻辑。我现在想让一个jar文件中的某个服务访问另一个jar文件中的另一个服务。这由于权限而被拒绝。如果我注释掉权限,那么一切正常。

无论如何,我可以在拨打此服务前通过春季进行身份验证吗? (也许用一个虚拟用户?)或者关闭相同应用程序内的罐子的安全性?还是我的设计错了?

其他人都有这种问题?我应该用什么样的设计呢?

+0

嗨!我认为你的潜在问题是一个设计问题。正如你所说的那样,被其他服务调用的服务似乎应该被分成两部分,一部分具有权限,另一部分具有特征或行为,后者被服务访问的_private_仅限层。它可能无法实现,因为你的jar分离,但我认为它会更整洁。 – coya

回答

2

你需要给调用服务(在其他jar)由@PreAuthorize所需的权限(为线程被调用的服务)。

如果线程是由用户请求在Web应用程序中触发的,那么这通常是用户权限。

但是,当线程被一些定时服务触发,那么你需要给他们正确的认证

Authentication authentication = new UsernamePasswordAuthenticationToken("dummy", "password"); 
    SecurityContext securityContext = SecurityContextHolder.getContext(); 
    securityContext.setAuthentication(authentication); 
+0

完美地工作。谢谢@Ralph – RNJ

-2

我相信这是一个很好的例子,你应该使用Spring Security @Secured注解

  • 什么是@Secured注解?
    从版本2.0开始,Spring Security已经大大改进了对服务层方法增加安全性的支持。它为 提供了对JSR-250注释安全性以及 框架的原始@Secured注释的支持。

    来源:Spring Security 3.1 Reference 2.4 Method Security
    @Secured注解允许你把限制在你的方法。例如,您可以授权所有 注册用户使用get()方法。但是对于edit()方法,您可以将其标记为仅供管理员访问的 。

退房一些教程在:
http://burtbeckwith.com/blog/?p=1398
http://krams915.blogspot.in/2010/12/spring-security-3-mvc-using-secured.html

+0

“@ Secured”应该如何帮助解决这个问题? – Ralph

+0

好的,也许我没有正确理解您的问题,如果您希望提供虚拟身份验证,您可以创建一个SYSTEM_ROLE,并授予来自调用服务的权限,将角色添加到安全服务。另外,如果你想禁用安全性,你不能从配置本身做到这一点吗?<@ PreAuthorize是一个基于'@ Secured'的扩展注释。“#安全性:全局方法安全性secured-annotations =”已禁用“访问决策管理器ref =”aclAccessDecisionManager“> – Anshu

+0

。你的建议没有意义。 – eis