一 引言
在前面的文章我们是了解到传统的分布式架构在鉴权时,是通过Gateway网关来对接口请求进行统一的客户端鉴权,这种好处就是在代码编写时,只要不经过网关我们在测试接口的不需要token就能快速反问接口,这种在平时开发时是比较遍历,但是一旦资源服务器的端口暴露,就相当于全部的接口裸露在外面,是比较危险的
但是每个资源服务的oauth2客户端配置是比较类似的,我们可以抽离出一个公用的组件,对外提供一个资源服务器注解即可,让对应的资源服务器变成oauth2的客户端,这样极大的提高了资源服务器的安全性
代码目录
二 代码实现
抽离oauth2公用客户端配置
public class CustomResourceServerConfigurerAdapter extends ResourceServerConfigurerAdapter {
@Autowired
private TokenStore tokenStore;
@Autowired
private ResourceServerTokenServices resourceServerTokenServices;
@Autowired
private PermitAllUrlResolver permitAllUrlResolver;
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenStore(tokenStore);
resources.tokenServices(resourceServerTokenServices);
}
@Override
public void configure(HttpSecurity httpSecurity) throws Exception {
/*httpSecurity.authorizeRequests()
.antMatchers("/user/**").permitAll()
.anyRequest().authenticated();*/
httpSecurity.headers().frameOptions().disable();
ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests();
// 注册需要对外暴露的端口
permitAllUrlResolver.registry(registry);
registry.anyRequest().authenticated().and().csrf().disable();
}
}
通过
ImportBeanDefinitionRegistrar
注入bean实例
@Slf4j
public class CncloudSecurityBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
public static final String RESOURCE_SERVER_CONFIGURER = "resourceServerConfigurerAdapter";
/**
* 根据注解值动态注入资源服务器的相关属性
* @param metadata 注解信息
* @param registry 注册器
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
if (registry.isBeanNameInUse(RESOURCE_SERVER_CONFIGURER)) {
log.warn("本地存在资源服务器配置,覆盖默认配置:" + RESOURCE_SERVER_CONFIGURER);
return;
}
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(CustomResourceServerConfigurerAdapter.class);
registry.registerBeanDefinition(RESOURCE_SERVER_CONFIGURER, beanDefinition);
}
}
对外提供客户端注解
@Documented
@Inherited
@EnableResourceServer
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Import(CncloudSecurityBeanDefinitionRegistrar.class)
public @interface EnableCncloudResourceServer {
}
资源服务器引入核心注解