陆小曼|OAuth2.0分布式系统环境搭建( 四 )


接下来就需要对具体的资源服务进行配置:
@Configuration@EnableResourceServerpublicclassResourceServerConfigextendsResourceServerConfigurerAdapter{publicstaticfinalStringRESOURCE_ID="res1";@AutowiredprivateTokenStoretokenStore;@Overridepublicvoidconfigure(ResourceServerSecurityConfigurerresources){resources.tokenStore(tokenStore).resourceId(RESOURCE_ID).stateless(true);}@Overridepublicvoidconfigure(HttpSecurityhttp)throwsException{http.authorizeRequests().antMatchers("/uaa/**").permitAll().antMatchers("/order/**").access("#oauth2.hasScope('ROLE_API')");}}在这里面 , 配置了访问认证服务不需要任何的权限 。 访问订单资源服务需要用户必须具有“ROLE_API”的scope权限 。 其中注入的tokenStore和认证服务中的TokenConfig一致 。
因为订单微服务还没有创建 , 所以我们来测试一下网关访问认证授权服务 。 网关的端口是8010 。
来测试一下 , 先是通过网关获取令牌 , 网关微服务的端口是8010 。
订单资源服务最后 , 我们就可以去创建资源服务了 。 在父工程下创建一个名为oauth2_order的Module 。
第一步 , 先进行一些安全配置:
@Configuration@EnableGlobalMethodSecurity(securedEnabled=true,prePostEnabled=true)publicclassWebSecurityConfigextendsWebSecurityConfigurerAdapter{@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{http.csrf().disable().authorizeRequests().antMatchers("/r/**").authenticated()//所有/r/**的请求必须认证通过.anyRequest().permitAll();//除了/r/** , 其它的请求可以访问}}这个@EnableGlobalMethodSecurity是干吗的呢?是为了开启注解权限控制的 , 只有开启了之后 , 我们才可以在需要进行权限控制的地方去添加注解实现权限控制 。
接下来就是对资源服务器的配置了 。 在@Configuration注解的配置类上添加@EnableResourceServer注解 , 然后继承自ResourceServerConfigurerAdapter类 , 然后重写里面的configure()方法即可 。
@Configuration@EnableResourceServerpublicclassResourceServerConfigextendsResourceServerConfigurerAdapter{publicstaticfinalStringRESOURCE_ID="res1";//资源服务的id@AutowiredprivateTokenStoretokenStore;//管理令牌的方式 , TokenConfig中的@Overridepublicvoidconfigure(ResourceServerSecurityConfigurerresources)throwsException{resources.resourceId(RESOURCE_ID).tokenStore(tokenStore).stateless(true);}@Overridepublicvoidconfigure(HttpSecurityhttp)throwsException{http.authorizeRequests().antMatchers("/**").access("#oauth2.hasScope('ROLE_ADMIN')").and().csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);}}接下来就是在需要进行权限控制的方法上面添加注解 。
@RestControllerpublicclassOrderController{@GetMapping(value="https://pcff.toutiao.jxnews.com.cn/r1")@PreAuthorize("hasAuthority('p1')")//拥有p1权限方可访问此urlpublicStringr1(){return"访问资源成功";}}ok!成功了 。 再来试一下通过网关去访问order中的资源 , 用一个没有权限的用户访问试试 。