报告 authorizeHttpRequests / authorizeRequests 链中无法到达的请求匹配器,因为一个更早且更通用的匹配器已覆盖这些请求

Spring Security 按声明顺序评估匹配器,第一个匹配的规则会生效,因此,如果一个具体的规则位于一个更通用的规则之后,而且也与之相匹配,则会静默忽略该具体规则。 更具体的匹配器必须首先出现。

不正确(标记的规则会被忽略):


  http.authorizeHttpRequests(auth -> auth
    .requestMatchers("/", "/home").permitAll()
    .requestMatchers(HttpMethod.POST, "/home").hasRole("USER")        // 由更早的“/home”覆盖
    .requestMatchers(HttpMethod.GET, "/test1/**").hasRole("USER")
    .requestMatchers(HttpMethod.GET, "/test1/test2").hasRole("ADMIN") // 由更早的“/test1/**”覆盖
    .anyRequest().authenticated()
  );

正确(先排列最具体项):


  http.authorizeHttpRequests(auth -> auth
    .requestMatchers(HttpMethod.POST, "/home").hasRole("USER")
    .requestMatchers("/", "/home").permitAll()
    .requestMatchers(HttpMethod.GET, "/test1/test2").hasRole("ADMIN")
    .requestMatchers(HttpMethod.GET, "/test1/**").hasRole("USER")
    .anyRequest().authenticated()
  );