由于本项目资源服务和认证服务不在同一服务上,这里token‘认证使用远程认证服务器认证
修改资源服务器的配置,主要在配置类继承资源配置ResourceServerConfigurerAdapter的configure方法
1) 设置RestTemplate,默认RestTemplate有些格式无法解析,配置相关解析器
@LoadBalanced @Bean public RestTemplate restTemplate() { //httpRequestFactory() RestTemplate restTemplate = new RestTemplate(); List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters(); for (HttpMessageConverter<?> converter : converters) { if (converter instanceof MappingJackson2HttpMessageConverter) { MappingJackson2HttpMessageConverter jsonConverter = (MappingJackson2HttpMessageConverter) converter; jsonConverter.setObjectMapper(new ObjectMapper()); jsonConverter.setSupportedMediaTypes(ImmutableList.of(new MediaType("application", "json", MappingJackson2HttpMessageConverter.DEFAULT_CHARSET), new MediaType("text", "javascript", MappingJackson2HttpMessageConverter.DEFAULT_CHARSET))); } } return restTemplate; }
2) 设置token解析器,因为认证服务使用的为默认解析器,这里保持一致
@Bean public AccessTokenConverter accessTokenConverter() { return new DefaultAccessTokenConverter(); }
设置远程远程调用服务,以及配置
@Override public void configure(ResourceServerSecurityConfigurer resources) { resources.tokenServices(tokenServices());//.resourceId(SPARKLR_RESOURCE_ID); } @Bean public ResourceServerTokenServices tokenServices() { RemoteTokenServices remoteTokenServices = new RemoteTokenServices(); remoteTokenServices.setCheckTokenEndpointUrl("https://security-service/oauth/check_token");//这里硬编码客户端信息,服务端硬编码保存在内存里,生产上请修改 remoteTokenServices.setClientId("client"); remoteTokenServices.setClientSecret("password"); remoteTokenServices.setRestTemplate(restTemplate()); remoteTokenServices.setAccessTokenConverter(accessTokenConverter()); return remoteTokenServices; }
认证服务的修改
1) 为了是校验请求通过,认证服务,修改配置public class OAuth2Config extends AuthorizationServerConfigurerAdapter
增加.checkTokenAccess("permitAll()")
@Override public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { security // 开启/oauth/token_key验证端口无权限访问 .tokenKeyAccess("permitAll()") .checkTokenAccess("permitAll()") .passwordEncoder(new BCryptPasswordEncoder())// 请求/oauth/token的,如果配置支持allowFormAuthenticationForClients的,且url中有client_id和client_secret的会走ClientCredentialsTokenEndpointFilter .allowFormAuthenticationForClients(); }
测试如下
正确携带token访问api-server的接口
图片.png
不使用token、或者错误token使用,返回401或者token异常500
图片.png
作者:勃列日涅夫
链接:https://www.jianshu.com/p/fc814157bae9
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦