spring-security Spring Security路径蚂蚁匹配器及其路径变量

l3zydbqr  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(201)

我正在配置一个有2个安全入口点的Sping Boot 应用程序,我配置了第一个入口点,它是一个基本身份验证,以匹配蚂蚁模式/synchro/task/**。但当我测试它时,当我尝试仅使用/synchro/task的URL时,它工作正常,但当我获得/synchro/task/1等任务ID时,它不工作。
我的代码如下:

http
    .csrf().disable()
    .antMatcher("/synchro/task/**")
    .authorizeRequests()
        .anyRequest().hasRole("APP")
        .and()
    .httpBasic();

我还尝试使用requestMatchers和两个antmatchers来匹配/synchro/task/*/synchro/task/**,但它只需要/synchro/task,但在有id的情况下不需要。
有趣的事实是,当我设置如下:

http
    .csrf().disable()
    .antMatcher("/synchro/task/*")
    .authorizeRequests()
        .anyRequest().hasRole("APP")
        .and()
    .httpBasic();

例如,它只适用于/synchro/task/1,但不适用于/synchro/task
因此,即使我真的认为antMatcher("/synchro/task/**")将覆盖有id和没有id的两个路径,我如何将两者结合起来呢?
下面是我的控制器类:

@RestController
@RequestMapping(value = "/synchro")
public class SynchroResource extends GenericResource {
    @Autowired
    private IndexationService indexationService;
    @Autowired
    private SynchroService synchroService;

    @RequestMapping(value = "/task", method = RequestMethod.GET)
    public IndexationTaskResponse getNextTask() {
        return this.indexationService.getNextTask();
    }

    @RequestMapping(value = "/task/{taskId}", method = RequestMethod.PUT)
    public void updateTaskState(@PathVariable long taskId,
                            @RequestBody(required = false) String errorMessage) {
        this.indexationService.updateTaskState(taskId, errorMessage);
    }
}
azpvetkf

azpvetkf1#

请尝试以下代码:

http
    .csrf().disable();

http
    .antMatcher("/synchro/task/**")
    .authorizeRequests()
        .antMatchers("/synchro/task/**").hasRole("APP")
        .and()
    .httpBasic();
g2ieeal7

g2ieeal72#

/synchro/task/**仅与路径/synchro/task/中的目录匹配,请参见AntPathMatcher
Map使用以下规则匹配URL:

  • ?匹配一个字符
    • 匹配零个或多个字符
      ***与路径中的零个或多个目录匹配
  • {spring:[a-z]+}将regexp [a-z]+匹配为名为“spring”的路径变量

但是/synchro/task不是路径/synchro/task/中的目录,因此需要添加父目录/synchro/task
您修改的代码:

http
    .csrf().disable()
    .requestMatchers()
        .antMatchers("/synchro/task", "/synchro/task/**")
    .authorizeRequests()
        .anyRequest().hasRole("APP")
        .and()
    .httpBasic();

相关问题