首先我们查看SecurityConfigure
继承的类WebSecurityConfigurerAdapter
的源码:
@Order(100)
public abstract class WebSecurityConfigurerAdapter implements WebSecurityConfigurer<WebSecurity> {
......
}
可以看到类上使用了@Order(100)
标注,说明其顺序是100。
再来看看ResourceServerConfigure
类上@EnableResourceServer
注解源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ResourceServerConfiguration.class})
public @interface EnableResourceServer {
}
该注解引入了ResourceServerConfiguration
配置类,查看ResourceServerConfiguration
源码:
@Configuration
public class ResourceServerConfiguration extends WebSecurityConfigurerAdapter implements Ordered {
private int order = 3;
......
}
所以ResourceServerConfigure
的顺序是3。在Spring中,数字越小,优先级越高,也就是说ResourceServerConfigure
的优先级要高于SecurityConfigure
,这也就意味着所有请求都会被ResourceServerConfigure
过滤器链处理,包括/oauth/
开头的请求。这显然不是我们要的效果,我们原本是希望以/oauth/
开头的请求由SecurityConfigure
过滤器链处理,剩下的其他请求由ResourceServerConfigure
过滤器链处理。
为了解决上面的问题,我们可以手动指定这两个类的优先级,让SecurityConfigure
的优先级高于ResourceServerConfigure
。
在SecurityConfigure
类上使用Order(2)
注解标注即可:
@Order(2)
@EnableWebSecurity
public class SecurityConfigure extends WebSecurityConfigurerAdapter {
......
}