欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloudAlibaba+Zuul+OAuth2 (一) 搭建认证微服务

程序员文章站 2022-06-13 19:59:11
...

开发背景什么的我就不介绍了 既然大家需要用到这个技术 直接撸代码吧!!!

1.创建maven springboot项目 添加相关依赖 采用最新的版本(相关依赖版本如下)

<!--spring-boot 版本-->
<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.2.5.RELEASE</version>
</parent>

<!--spring-cloud  spring cloud alibaba版本-->

<dependencyManagement>
        <dependencies>
            <!--整合spring cloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--整合spring cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>


<!--整合oauth2-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.创建oauth2 认证服务器配置类 (客户端应用)

/**
 *
 * @Description Authorization配置
 * @Date 2020/6/24 11:36
 * @Author Jax
 */
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthServiceConfig extends AuthorizationServerConfigurerAdapter {


    @Autowired
    private PasswordEncoder passwordEncoder;

   /**
     * 这里先把服务写到内存里面 后续配置到mysql
     * 配置client服务详情(也就说有哪些服务可以来向我申请令牌)
     * authorizedGrantTypes类型支持https://www.cnblogs.com/strugglepcx/p/5139013.html
     * see:org.springframework.security.oauth2.provider.authentication
     * 我这里假设我现在有一个游戏微服务game_client  一个网关微服务gateway_client
     * @param clients
     * @throws Exception
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("game_client")
                .secret(passwordEncoder.encode("123456"))
                .accessTokenValiditySeconds(3600)
                .resourceIds("game-service")
                .scopes("read", "write")
                .authorizedGrantTypes("password")
                .and()
                .withClient("gateway_client")
                .secret(passwordEncoder.encode("123456"))
                .accessTokenValiditySeconds(3600)
                .resourceIds("gateway")
                .scopes("read", "write")
                .authorizedGrantTypes("password");
    }
}

3.需要配置认证服务器知道可以让哪些用户来访问我 即authenticationManager配置

/**
 *
 * @Description Authorization配置
 * @Date 2020/6/24 11:36
 * @Author Jax
 */
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthServiceConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private PasswordEncoder passwordEncoder;

    


   /**
     * 这里先把服务写到内存里面 后续配置到mysql
     * 配置client服务详情(也就说有哪些服务可以来向我申请令牌)
     * authorizedGrantTypes类型支持https://www.cnblogs.com/strugglepcx/p/5139013.html
     * see:org.springframework.security.oauth2.provider.authentication
     * 我这里假设我现在有一个游戏微服务game_client  一个网关微服务gateway_client
     * @param clients
     * @throws Exception
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("game_client")
                .secret(passwordEncoder.encode("123456"))
                .accessTokenValiditySeconds(3600)
                .resourceIds("gateway", "game-service")
                .scopes("read", "write")
                .authorizedGrantTypes("password")
                .and()
                .withClient("gateway_client")
                .secret(passwordEncoder.encode("123456"))
                .accessTokenValiditySeconds(3600)
                .resourceIds("gateway", "game-service")
                .scopes("read", "write")
                .authorizedGrantTypes("password");
    }


    /**
     * 配置哪些可以访问认证服务器
     *
     * @param endpoints
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager); //authenticationManager校验传递进来的用户是否合法
    }


}

4.写好前面的配置 这个时候我们需要来配置低3步中注入的AuthenticationManager  PasswordEncoder 

/**
 * @Description 配置认证服务器WEB配置
 * @Date 2020/6/24 11:49
 * @Author Jax
 */
@Configuration
@EnableWebSecurity
public class OAuth2WebSecurityConfig extends WebSecurityConfigurerAdapter {

    //根据用户名获取用户详细信息 接下来 我们需要来实现这个方法 (第5步)
    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
                .passwordEncoder(passwordEncoder());
    }

    /**
     * 暴露AuthenticationManager
     */
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

5.实现UserDetailsService这个方法 编写代码

/**
 * @Description 获取用户信息
 * @Date 2020/6/24 12:31
 * @Author Jax
 */
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        //TODO 需要去数据库查询当前用户信息 这里方便测试 采用org.springframework.security.core.userdetails 来构建一个用户
        return User.withUsername(username)  //构建一个用户所必须的3个条件 用户名 密码 权限 
                .password(passwordEncoder.encode("123456"))
                .authorities("ROLE_ADMIN")
                .build();
    }
}

6.完成上述步骤 现在合法的应用信息(3步) 合法的用户信息 现在我们都配置好了 接下来我们应该配置 微服务验证令牌的相关配置了 接着上面第3步 继续写代码

/**
 *
 * @Description Authorization配置
 * @Date 2020/6/24 11:36
 * @Author Jax
 */
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthServiceConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private PasswordEncoder passwordEncoder;

    


   /**
     * 这里先把服务写到内存里面 后续配置到mysql
     * 配置client服务详情(也就说有哪些服务可以来向我申请令牌)
     * authorizedGrantTypes类型支持https://www.cnblogs.com/strugglepcx/p/5139013.html
     * see:org.springframework.security.oauth2.provider.authentication
     * 我这里假设我现在有一个游戏微服务game_client  一个网关微服务gateway_client
     * @param clients
     * @throws Exception
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("game_client")
                .secret(passwordEncoder.encode("123456"))
                .accessTokenValiditySeconds(3600)
                .resourceIds("gateway", "game-service")
                .scopes("read", "write")
                .authorizedGrantTypes("password")
                .and()
                .withClient("gateway_client")
                .secret(passwordEncoder.encode("123456"))
                .accessTokenValiditySeconds(3600)
                .resourceIds("gateway", "game-service")
                .scopes("read", "write")
                .authorizedGrantTypes("password");
    }


    /**
     * 配置哪些可以访问认证服务器
     *
     * @param endpoints
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager); //authenticationManager校验传递进来的用户是否合法
    }


    /**
     * 配置验证令牌的条件(即满足什么样的条件才能找我验证令牌 避免随便拿token也来验证)
     * 这里都先做一个最基本的配置
     *
     * @param security
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.checkTokenAccess("isAuthenticated()");//检验服务验证的规则 必须是经过验证的 用户名 密码 就是上面所配置的 game_client 123456 ..... 我才给你验证令牌
    }



}

7.启动OAuth 微服务 使用postman访问localhost:8032/oauth/token 进行测试 获取token

SpringCloudAlibaba+Zuul+OAuth2 (一) 搭建认证微服务

SpringCloudAlibaba+Zuul+OAuth2 (一) 搭建认证微服务

返回结果如下 

SpringCloudAlibaba+Zuul+OAuth2 (一) 搭建认证微服务

OK SpringCloudAlibaba+Zuul+OAuth2 (一) 搭建认证微服务 完成!