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


JdbcAuthorizationCodeServices原理和JdbcClientDetailsService差不多 , 都是创建出指定的表 。 TokenStore和JwtAccessTokenConverter为了方便管理 , 我们使用TokenConfig这个类去配置Token相关的内容 。 添加了@Bean注解将其添加到Spring容器后就可以在其它的类中去注入使用了 。 @ConfigurationpublicclassTokenConfig{privateStringSIGNING_KEY="robod_hahaha";//对称加密的密钥@BeanpublicTokenStoretokenStore(){//JWT令牌方案returnnewJwtTokenStore(jwtAccessTokenConverter());}@BeanpublicJwtAccessTokenConverterjwtAccessTokenConverter(){JwtAccessTokenConverterconverter=newJwtAccessTokenConverter();converter.setSigningKey(SIGNING_KEY);//对称秘钥 , 资源服务器使用该秘钥来验证returnconverter;}}采用了JWT令牌管理方式 , 然后使用了对称密钥去进行加密 。 还有另外几种令牌管理方式:InMemoryTokenStore:在内存中存储令牌(默认)JdbcTokenStore:令牌存储在数据库中RedisTokenStore:令牌存储在Redis中AuthorizationServerTokenServices这个是用来配置令牌管理服务的 , 我们配置了客户端详情服务 , 令牌增强等内容 。 申请令牌的四种方式到现在为止 , 我们的认证授权服务就已经配置好了 , 那么现在就可以去申请令牌了 , 申请令牌的方式一共有四种:
授权码模式第一步申请授权码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微服务 。
老样子 , 第一步进行一些安全配置
@ConfigurationpublicclassWebSecurityConfigextendsWebSecurityConfigurerAdapter{@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{http.authorizeRequests().antMatchers("/**").permitAll().and().csrf().disable();}}我们在这里设置了可以接收任何请求 , 不需要任何的权限 。