Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Security@PreAuthorize,应用程序本身作为用户_Spring_Spring Mvc_Spring Security - Fatal编程技术网

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

Spring Security@PreAuthorize,应用程序本身作为用户,spring,spring-mvc,spring-security,Spring,Spring Mvc,Spring Security,我已经用SpringSecurity设置了一个spring应用程序。我已经用@PreAuthorize(…)注释了我的服务方法。因此,网络上的每个人都需要一些特定的权限来访问这些方法,这很好 但现在我有了一个新的用例。有一个@Scheduled方法正在运行,用于执行一些检查和发送消息。目前,只有角色为_USER的用户才允许发送消息。但现在应用程序本身也必须发送这些消息 我应该如何设法拥有某种不可见的用户(=应用程序),该用户一直登录并拥有特定的权限?或者“所有权利”也不错,所以它忽略了所有这些安

我已经用SpringSecurity设置了一个spring应用程序。我已经用@PreAuthorize(…)注释了我的服务方法。因此,网络上的每个人都需要一些特定的权限来访问这些方法,这很好

但现在我有了一个新的用例。有一个@Scheduled方法正在运行,用于执行一些检查和发送消息。目前,只有角色为_USER的用户才允许发送消息。但现在应用程序本身也必须发送这些消息

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

谢谢你的帮助

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

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

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

  • 编辑2:还有一些想法:


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

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

    我遇到了类似的问题,我实现的解决方案是内部和“外部”服务实现。外部的有内部的自动连接。任何应用程序内部组件(如计划作业)都会连接到内部服务。任何Web公开的组件都会连接到安全的“外部”服务,该服务会有
    @PreAuthorize
    等注释,但在其他情况下,这些注释将充当内部服务的委托

    在将消息传递到内部服务之前,我还记录了用于授权的身份验证对象的主体。您知道在SecurityContext中会有一个可用的,所以选择它并在日志中记录外部调用内部服务的人。我执行以下操作(您的委托人可以是非用户名,但仍然希望共享):


    这就像:调度器检查表A中是否有用户X的新条目。如果有新条目,系统将为该用户X生成一条消息,该消息包含一些文本和指向这些新条目的链接。没什么特别的。。。我只需要回答两个问题(我将在一分钟后把它们附加到问题后面)我工作的企业使用ldap访问的中心目录。我们已经有一个系统用户进入了这个系统。我们从每个环境中的系统管理员提供给系统的属性文件中获取凭据。属性文件用于在需要时查找凭据。我们不缓存主体,因为在我们的情况下,它必须在每次调用之前进行身份验证。将凭据硬编码到应用程序中并不是一个好主意,在应用程序中可以对其进行反向工程。此外,每个环境中的凭证往往不同——开发、集成、qa、预生产和生产。
    final String currentUser = SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString();