• spring cloud笔记 oauth2授权服务 clientDetails配置源码


    clientDetails

    @EnableAuthorizationServer

    ...
    @Import({... AuthorizationServerSecurityConfiguration.class})
    ...
    

    AuthorizationServerSecurityConfiguration

    ...
    // 引入clientDetails配置
    @Import({ ClientDetailsServiceConfiguration.class... })
    ...
    // 注入客制实现的AuthorizationServerConfigurerAdapter
    @Autowired 
    private List<AuthorizationServerConfigurer> configurers = Collections.emptyList();
    @Autowired
    private ClientDetailsService clientDetailsService;
    @Autowired
    public void configure(ClientDetailsServiceConfigurer clientDetails) throws Exception {
    	for (AuthorizationServerConfigurer configurer : configurers) {
    		configurer.configure(clientDetails); // 此处完成clientDetailsService配置
    	}
    }
    ...
    

    ClientDetailsServiceConfiguration

    @Configuration
    public class ClientDetailsServiceConfiguration {
    
    	@SuppressWarnings("rawtypes")
    	private ClientDetailsServiceConfigurer configurer = new ClientDetailsServiceConfigurer(new ClientDetailsServiceBuilder());
    	
    	@Bean
    	public ClientDetailsServiceConfigurer clientDetailsServiceConfigurer() {
    		return configurer;
    	}
    
    	@Bean
    	@Lazy
    	@Scope(proxyMode=ScopedProxyMode.INTERFACES)
    	public ClientDetailsService clientDetailsService() throws Exception {
    		return configurer.and().build();
    	}
    
    }
    

    ClientDetailsServiceConfigurer

    ...
    // 替换为自定义客户端信息服务
    public ClientDetailsServiceBuilder<?> withClientDetails(ClientDetailsService clientDetailsService) throws Exception {
    setBuilder(getBuilder().clients(clientDetailsService));
    	return this.and();
    }
    // 替换为内存客户端信息服务
    public InMemoryClientDetailsServiceBuilder inMemory() throws Exception {
    	InMemoryClientDetailsServiceBuilder next = getBuilder().inMemory();
    	setBuilder(next);
    	return next;
    }
    // 替换为JDBC客户端信息服务
    public JdbcClientDetailsServiceBuilder jdbc(DataSource dataSource) throws Exception {
    	JdbcClientDetailsServiceBuilder next = getBuilder().jdbc().dataSource(dataSource);
    	setBuilder(next);
    	return next;
    }
    ...
    

    passwordEncoder

    AuthorizationServerConfigurerAdapter

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.passwordEncoder(passwordEncoder);
    }
    

    AuthorizationServerSecurityConfigurer

    @Override
    public void init(HttpSecurity http) throws Exception {
    ...
    // 根据有无配置编码器实例化ClientDetailsUserDetailsService
    	if (passwordEncoder != null) {
    		ClientDetailsUserDetailsService clientDetailsUserDetailsService = new ClientDetailsUserDetailsService(clientDetailsService());
    		clientDetailsUserDetailsService.setPasswordEncoder(passwordEncoder());
    		http.getSharedObject(AuthenticationManagerBuilder.class)
    				.userDetailsService(clientDetailsUserDetailsService)
    				.passwordEncoder(passwordEncoder());
    	}
    	else {
    		http.userDetailsService(new ClientDetailsUserDetailsService(clientDetailsService()));
    	}
    }
    
  • 相关阅读:
    MySQL连接数过多登录不上
    Linux中盘符的两种挂载方法
    Linux杀毒软件ClamAV初次体验
    VS2013开发asmx接口根据ID查询对象
    VS2013开发asmx接口返回一个自定义XML
    VS2013开发一个简单的asmx接口程序
    Java编译过程(传送门)
    凡人和神学习和使用软件的七个层次
    CentOS7 限制SSH密码尝试次数
    马云是如何招聘到多隆这样的牛人的?(转)
  • 原文地址:https://www.cnblogs.com/luguojun/p/14294804.html
Copyright © 2020-2023  润新知