OAuth2.0分布式系统环境搭建( 三 )

申请令牌的四种方式到现在为止,我们的认证授权服务就已经配置好了,那么现在就可以去申请令牌了,申请令牌的方式一共有四种:

  • 授权码模式第一步申请授权码http://localhost:8001/uaa/oauth/authorize?client_id=c1&response_type=code&scope=ROLE_ADMIN&redirect_uri=http://localhost注意,这里的client_id,scope和redirect_uri都是在oauth_client_details表中设置过的,要一一对应上,否则不行,response_type授权码模式固定为code 。成功访问后,在页面上输入用户名和密码,验证通过后,在浏览器的地址栏中就可以看到返回的授权码 。然后我们拿着授权码就可以向服务器去申请Token了,参数列表必须和数据库中配置的一致 。
  • 简化模式http://localhost:8001/uaa/oauth/authorize?client_id=c1&response_type=token&scope=ROLE_ADMIN&redirect_uri=http://localhost在简化模式下,我们只需要去指定client_id,response_type,scope和redirect_uri即可,请求成功后,就会跳转到指定的uri界面,然后令牌就在url中 。
  • 密码模式在密码模式下,我们需要将用户名和密码传到服务器中,验证通过后,服务器会直接将Token返回给我们
  • 客户端模式该模式最简单,也是最不安全的 。
网关搭建完了认证授权服务再来创建网关服务 。在父工程下创建一个名为oauth2_gateway的Module 。启动类没什么好说的,配置文件中有几点需要注意:
spring.application.name=gatewayserver.port=8010zuul.routes.uaa.stripPrefix = falsezuul.routes.uaa.path = /uaa/**zuul.routes.order.stripPrefix = falsezuul.routes.order.path = /order/**eureka.client.serviceUrl.defaultZone = http://localhost:8000/eureka/…………我们配置了微服务的名称及端口,还配置了将路径为/zuul/uaa/**和 /zuul/order/**的请求转发给uaa和order微服务 。
老样子,第一步进行一些安全配置
@Configurationpublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/**").permitAll().and().csrf().disable();}}我们在这里设置了可以接收任何请求,不需要任何的权限 。
接下来就需要对具体的资源服务进行配置:
@Configuration@EnableResourceServerpublic class ResourceServerConfig extends ResourceServerConfigurerAdapter {public static final String RESOURCE_ID = "res1";@Autowiredprivate TokenStore tokenStore;@Overridepublic void configure(ResourceServerSecurityConfigurer resources) {resources.tokenStore(tokenStore).resourceId(RESOURCE_ID).stateless(true);}@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/uaa/**").permitAll().antMatchers("/order/**").access("#oauth2.hasScope('ROLE_API')");}}在这里面,配置了访问认证服务不需要任何的权限 。访问订单资源服务需要用户必须具有 “ROLE_API”的scope权限 。其中注入的tokenStore和认证服务中的TokenConfig一致 。
因为订单微服务还没有创建,所以我们来测试一下网关访问认证授权服务 。网关的端口是8010 。
来测试一下,先是通过网关获取令牌,网关微服务的端口是8010 。
OAuth2.0分布式系统环境搭建

文章插图
 
可以看到,申请到了令牌,说明请求成功地被转发到了认证服务 。
订单资源服务最后,我们就可以去创建资源服务了 。在父工程下创建一个名为oauth2_order的Module 。
第一步,先进行一些安全配置:
@Configuration@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/r/**").authenticated()//所有/r/**的请求必须认证通过.anyRequest().permitAll();//除了/r/**,其它的请求可以访问}}这个@EnableGlobalMethodSecurity是干吗的呢?是为了开启注解权限控制的,只有开启了之后,我们才可以在需要进行权限控制的地方去添加注解实现权限控制 。
接下来就是对资源服务器的配置了 。在@Configuration注解的配置类上添加@EnableResourceServer注解,然后继承自ResourceServerConfigurerAdapter类,然后重写里面的configure()方法即可 。
@Configuration@EnableResourceServerpublic class ResourceServerConfig extends ResourceServerConfigurerAdapter {public static final String RESOURCE_ID = "res1";//资源服务的id@Autowiredprivate TokenStore tokenStore;//管理令牌的方式,TokenConfig中的@Overridepublic void configure(ResourceServerSecurityConfigurer resources) throws Exception {resources.resourceId(RESOURCE_ID).tokenStore(tokenStore).stateless(true);}@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/**").access("#oauth2.hasScope('ROLE_ADMIN')").and().csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);}}


推荐阅读