报告 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()
);