【问题标题】:How to integrate Spring Security with Spring Batch?如何将 Spring Security 与 Spring Batch 集成?
【发布时间】:2015-03-18 09:03:40
【问题描述】:

我想创建一个安全的 Web 应用程序,用户可以在其中启动 Spring Batch 作业。我想跟踪谁启动了哪个工作,因此我必须将JobInstance(或JobExecution?)与用户相关联。我还想查询由特定用户启动的JobExecutions。这似乎不是一个常见的用例,因为我在参考指南中找不到解决方案。

我必须为 Spring Batch 的持久层编写自己的实现吗?对于仅向表中添加字段来说,这似乎是很多开销。有人知道一个简单的解决方案吗?

【问题讨论】:

  • 您的意思是我将始终将当前(或启动)用户注入参数中?使用这种方法时,如何根据“用户参数”查询JobExecutions
  • 是否适合扩展默认实现并添加执行这些查询的方法?
  • 钓鱼时。但似乎我 JdbcJobInstanceDao 拥有你需要的一切。
  • 我不这么认为。例如,我将用户和时间戳作为每个作业的识别参数。当时间戳未知时,我无法搜索JobInstance

标签: java spring spring-security spring-batch


【解决方案1】:

正如@Artem Bilan 建议的那样,我将当前用户注入JobParameters。我编写了一个简单的服务类,它提供了一种查询给定用户的执行 ID 的方法:

@Service
public class JobService {

    private static final String FIND_EXECUTIONS = "SELECT JOB_EXECUTION_ID FROM batch_job_execution_params WHERE KEY_NAME = 'user' AND STRING_VAL = ? ORDER BY JOB_EXECUTION_ID DESC";

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<Long> findJobExecutionIdsByUser(String username) {
        return jdbcTemplate.queryForList(FIND_EXECUTIONS, Long.class, username);
    }

}

有了这个列表,我可以像这样从默认的JobExplorer 获取JobExecutions:

final List<Long> executionIds = jobService.findJobExecutionIdsByUser("user");
final List<JobExecution> executions = new ArrayList<>();

for (Long executionId : executionIds) {
    final JobExecution execution = explorer.getJobExecution(executionId);

    if (execution != null) {
        executions.add(execution);
    }
}

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 2014-05-16
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2014-05-22
    • 2015-11-03
    相关资源
    最近更新 更多