3

我使用石英将 cronjobs 添加到 spring 应用程序。

在这些工作中,我想从另一个应用程序访问 spring-security 安全 bean 方法。

这是我的应用程序结构。

| - 核心
| - 网络应用
| - 工作应用程序

webapp 和 jobsapp 都使用核心服务。jobsapp 不是网络应用程序。它只是有石英工作。

如果我尝试访问使用 SpringSecurity global-method-security 保护的 bean,则在作业中出现异常{org.springframework.security.AuthenticationCredentialsNotFoundException}"org.springframework.security.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext"

如果我使用 SecurityContextHolder.getContext().setAuthentication 将上下文设置为高级用户,它就可以工作。

但是,我必须为所有工作都这样做。

有没有办法让所有的工作都以特定用户的身份运行?可能是某处的一些配置?

4

1 回答 1

1

你有两个选择:

  • 向上移动@Secured注释,从服务到 Web 层。如果我理解正确,您的 Quartz 作业直接访问服务 bean(绕过 Web 层),那么您也将绕过安全性

  • 就像您描述的那样,实现 Run-As 功能。它不必是那个手册。尝试模板方法模式或一些 AOP + 注释。它会变得相当干净。

我们尝试了这两种方法,将安全性转移到 Web 层效果稍好一些。这是可能的,因为服务层很好地映射到 Spring MVC 控制器方法。

于 2012-09-10T11:28:09.217 回答