【问题标题】:spring quartz job - accessing spring-security secured bean methodsspring 石英作业 - 访问 spring-security 安全 bean 方法
【发布时间】:2012-09-10 19:28:09
【问题描述】:

我使用石英将 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 将上下文设置为高级用户,它会起作用。

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

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

【问题讨论】:

    标签: spring-security quartz-scheduler


    【解决方案1】:

    你有两个选择:

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

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

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

    【讨论】:

    • 是的,我的工作直接访问服务 bean。但是,我无法将它们移动到 Web 层,因为我使用 osgi,如果它们位于不同的包中,注释将不起作用。 stackoverflow.com/questions/12158403 将尝试第二种方法。感谢您的回复。
    猜你喜欢
    • 2016-12-27
    • 2020-02-21
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2011-10-04
    • 1970-01-01
    • 2018-09-07
    相关资源
    最近更新 更多