如何将 Spring 安全与 Spring 批处理集成?
How to integrate Spring Security with Spring Batch?
我想创建一个安全的 Web 应用程序,用户可以在其中启动 Spring 批处理作业。我想跟踪谁启动了哪个作业,因此我必须将 JobInstance
(或 JobExecution
?)与用户相关联。我还想查询由特定用户启动的 JobExecution
s。这似乎不是一个常见的用例,因为我在参考指南中找不到解决方案。
我是否必须为 Spring Batch 的持久层编写自己的实现?对于仅向 table 添加一个字段来说,这似乎是很多开销。有人知道一个简单的解决方案吗?
正如@Artem Bilan 建议的那样,我将当前用户注入 JobParameters
。我编写了一个简单的服务 class,它提供了一种查询给定用户的执行 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
中获取 JobExecution
s:
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);
}
}
我想创建一个安全的 Web 应用程序,用户可以在其中启动 Spring 批处理作业。我想跟踪谁启动了哪个作业,因此我必须将 JobInstance
(或 JobExecution
?)与用户相关联。我还想查询由特定用户启动的 JobExecution
s。这似乎不是一个常见的用例,因为我在参考指南中找不到解决方案。
我是否必须为 Spring Batch 的持久层编写自己的实现?对于仅向 table 添加一个字段来说,这似乎是很多开销。有人知道一个简单的解决方案吗?
正如@Artem Bilan 建议的那样,我将当前用户注入 JobParameters
。我编写了一个简单的服务 class,它提供了一种查询给定用户的执行 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
中获取 JobExecution
s:
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);
}
}