3.3.4 资源服务授权 4.3.3.4.1 资源服务授权流程 资源服务拥有要访问的受保护资源,客户端携带令牌访问资源服务,如果令牌合法则可成功访问资源服务中的资 源,如下图:

上图的业务流程如下: 1、客户端请求认证服务申请令牌 2、认证服务生成令牌 认证服务采用非对称加密算法,使用私钥生成令牌。 3、客户端携带令牌访问资源服务 客户端在Http header 中添加: Authorization:Bearer 令牌。 4、资源服务请求认证服务校验令牌的有效性 资源服务接收到令牌,使用公钥校验令牌的合法性。 5、令牌有效,资源服务向客户端响应资源信息
3.3.4.2 资源服务授权配置

基本上所有微服务都是资源服务,这里我们在课程管理服务上配置授权控制,当配置了授权控制后如要访问课程信 息则必须提供令牌。 1、配置公钥 认证服务生成令牌采用非对称加密算法,认证服务采用私钥加密生成令牌,对外向资源服务提供公钥,资源服务使 用公钥 来校验令牌的合法性。 将公钥拷贝到 publickey.txt文件中,将此文件拷贝到资源服务工程的classpath下

2、添加依赖


[mw_shl_code=applescript,true]<dependency> <groupId>org.springframework.cloud</groupId>     
<artifactId>spring‐cloud‐starter‐oauth2</artifactId>  
   </dependency>[/mw_shl_code]

4、在config包下创建ResourceServerConfig类:


[mw_shl_code=applescript,true]@Configuration @EnableResourceServer @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)//激活方法上的 PreAuthorize注解 public class ResourceServerConfig extends ResourceServerConfigurerAdapter {   
    //公钥     private static final String PUBLIC_KEY = "publickey.txt";
    //定义JwtTokenStore,使用jwt令牌     
@Bean   
  public TokenStore tokenStore(JwtAccessTokenConverter jwtAccessTokenConverter) {    
    return new JwtTokenStore(jwtAccessTokenConverter);   
  }      
//定义JJwtAccessTokenConverter,使用jwt令牌  
   @Bean  
   public JwtAccessTokenConverter jwtAccessTokenConverter() {   
      JwtAccessTokenConverter converter = new JwtAccessTokenConverter();      
   converter.setVerifierKey(getPubKey());    
     return converter;   
  }   
  /**  
    * 获取非对称加密公钥 Key    
  * @return 公钥 Key  
    */    
private String getPubKey() {   
     Resource resource = new ClassPathResource(PUBLIC_KEY);      
   try {      
       InputStreamReader inputStreamReader = new  InputStreamReader(resource.getInputStream());             BufferedReader br = new BufferedReader(inputStreamReader);       
      return br.lines().collect(Collectors.joining("\n"));   
      } catch (IOException ioe) {       
      return null;     
    } 
    }     
//Http安全配置,对每个到达系统的http请求链接进行校验   
  @Override  
   public void configure(HttpSecurity http) throws Exception {         
        //所有请求必须认证通过          
       http.authorizeRequests().anyRequest().authenticated();  
   } }[/mw_shl_code]