【发布时间】:2012-04-26 10:35:52
【问题描述】:
我有一个使用@PreAuthorize 保护的方法
@PreAuthorize("hasRole('ROLE_ADMIN') and (#action.userId != principal.id)")
public void execute(EditAction action)
现在我需要从后台任务中调用此方法。如果我只是运行此代码 - 我会捕获一个异常:
AuthenticationCredentialsNotFoundException:在 SecurityContext 中找不到 Authentication 对象
看来,我需要将所需的身份验证设置为 SecurityContext。我可以:
- 为后台任务编写一些自定义 AuthenticationToken。
- 对假用户使用 UsernamePasswordAuthenticationToken。
- 不要在后台任务中使用安全方法。
- 还有其他建议吗?
什么是正确的方法?
【问题讨论】:
-
你能显示一些代码吗?你怎么称呼它?
-
这不是一个透明的调用——我们使用的是命令模式。 Secured方法是Handler的一种方法。 “后台任务”是指 jms MessageListener 或一些 @Scheduled 方法。我以某种方式调用安全方法,因为我通过处理 servlet 调用它 - 通过调度一个动作。