(七)SpringCloud+Security+Oauth2--oauth2客户端公用配置抽离

一 引言

在前面的文章我们是了解到传统的分布式架构在鉴权时,是通过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 {
    
    

}

资源服务器引入核心注解

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Instanceztt/article/details/128203377