前言
本文使用的代码可在gitee仓库自行克隆。
问题一
授权单独作为一个模块,资源服务器和 zuul 网关整合。通过网关去获取授权码时网关会将请求转发到授权服务器但是 session 不互通导致登录不成功。目前最好还是将 zuul网关、授权服务器、资源服务器整合到一块,避免 session 不互通。
问题二
zuul网关、授权服务器、资源服务器作为一个整体时,需要注意 WebSecurityConfig 和 ResourceServerConfiguration 里配置的拦截器执行顺序。由于后者的拦截器优先级高导致相同的 url 时前者的拦截器不生效,所以建议 ResourceServerConfiguration 里配置的拦截器只处理项目中自己写的 api 接口,WebSecurityConfig 里处理其他接口,如下所示:
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
...
@Override
public void configure(HttpSecurity http) throws Exception {
http
.formLogin().and() // 放开登录页
.requestMatchers()
.antMatchers("/api/**") // 只拦截/api的请求,其他都交给webSecurity处理
.and()
.authorizeRequests() // 处理拦截到的请求
.antMatchers("/api/order/getGoods").hasAnyAuthority("user")
.antMatchers("/api/user/getUser").hasAnyAuthority("user")
.antMatchers("/api/user/buy").hasAnyAuthority("user")
.antMatchers("/api/order/order").hasAnyAuthority("user")
.antMatchers("/api/order/create").hasAnyAuthority("user")
.antMatchers("/api/order/order").hasAnyAuthority("admin")
.anyRequest()//其他请求
.authenticated(); //需要身份认证;
}
...
}
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
...
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.formLogin() //使用登录界面登录
.and()
.requestMatchers()
.anyRequest() // 拦截任何请求
.and()
.authorizeRequests() // 对拦截的请求进行处理
.antMatchers("/login", "/oauth/**").permitAll()
.anyRequest().authenticated() // 除了上面的url都需要权限认证
.and()
.csrf().disable() //打开的csrf保护
// .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)//禁用session 默认授权页面将失效
;
}
...
}
评论区