我使用石英为弹簧应用添加了cronjobs。
在这些工作中,我想从另一个应用程序访问spring-security secure bean方法。
这是我的申请结构。
| - 核心
| - webapp
| - jobs-app
webapp和jobsapp都使用核心服务。 jobsapp不是Web应用程序。它只有石英工作。
如果我尝试访问使用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为高级用户设置上下文,它就可以工作。
但是,我必须为所有工作做到这一点。
有没有办法让所有工作成为特定用户?某处可能有些配置?
答案 0 :(得分:1)
您有两种选择:
向上移动@Secured
注释,从服务到网络层。如果我理解正确您的Quartz作业直接访问服务bean(绕过Web层),那么您也可以绕过安全性
实现Run-As功能,就像您描述的那样。它不一定是那本手册。尝试模板方法模式或一些AOP +注释。它会变得相当干净。
我们尝试了两种方法,并将安全性转移到Web层稍微好一点。这是可能的,因为服务层很好地映射到Spring MVC控制器方法。