Spring Security @PreAuthorize将应用程序本身作为用户

时间:2014-01-12 17:55:21

标签: spring spring-mvc spring-security

我有一个带弹簧安全性的弹簧应用程序。我用@PreAuthorize(...)注释了我的服务方法。因此,网络上的每个人都需要一些特定的权限来访问这些方法,这很好。

但现在我有一个新的用例。运行@Scheduled方法进行一些检查并发送消息。目前只允许使用ROLE_USER的人发送消息。但现在应用程序本身也必须发送这些消息。

我应该如何设法拥有某种不可见的用户(=应用程序),该用户始终登录并具有特定权限?或者也许“所有权利”也会很好,所以它只是忽略了所有这些安全注释。 或者我可能根本不需要“用户”?

感谢您的帮助!

编辑:主要的两个问题是:

  1. 我应该为应用程序创建真实用户吗?意思是:数据库的用户表中的条目?你是怎么解决的?也许你只是使用管理员用户的用户帐户(这是一个真人)?

  2. 如果我现在有这个“系统”用户。什么是“使用”它的最佳方式?例如,我会使用@Autowired User systemUser在我需要的任何地方访问该用户。 (当然在应用程序配置中有一点我用这个特定用户创建一个bean)。

  3. EDIT2:还有一些想法:

    我认为将来我想从应用程序的不同子系统发送消息。因此,使用admin用户是没有选择的,因为我需要一些具有不同名称的不同用户。

2 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,我实施的解决方案是内部和外部"服务实施。外部的内部组件已自动装入。任何应用程序内部组件(如计划的作业)都将连接内部服务。任何面向Web的组件都将具有安全&# 34;连接的外部" 服务,其中有@PreAuthorize等注释,但除此之外,它们将作为内部服务的委托。

在将消息传递到内部服务之前,我还记录了用于授权的身份验证对象的主体。你知道你在SecurityContext中有一个可用,所以选择它并在你的日志中记录外部调用内部服务的人。我在下面做(你的校长可能是非用户名,但仍然想分享):

final String currentUser = SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString();

答案 1 :(得分:0)

我认为您提供的所有答案都是相当常见的解决方案,因此它在很大程度上取决于您的要求。我正在开发的应用程序有一些强烈的审计要求,因此我们为应用程序本身设置了一个用户,以便在需要通过调度程序调用服务时使用。这允许我们根据给定的原则进行记录。也许你应该澄清你的要求?