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

OAuth2.0实战案例(二)搭建认证服务,就是这个服务里面就是来颁发token

程序员文章站 2022-06-04 16:17:02
...

OAuth2.0实战案例(二)搭建认证服务,就是这个服务里面就是来颁发token
我们的整个项目就是B系统,之前已经创建了资源服务,意思是以后想要访问资源服务里面的东西,要被OAuth2.0管理。

既然已经有了资源服务,并且这个资源服务是被OAuth2.0管理的。现在就需要一个认证的服务,这个认证服务的作用就是颁发token给A系统,A系统只要访问了这个认证服务,就会得到一个token,之后拿上这个token,就可以访问资源服务了。

认证服务的创建

1 导入依赖
2 写yml配置

3 认证的配置

OAuth2.0实战案例(二)搭建认证服务,就是这个服务里面就是来颁发token

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

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

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginProcessingUrl("/login")
                .permitAll()
                .and()
                .csrf()
                .disable();
    }

    //AuthenticationManager对象在OAuth2认证服务中要使用,提前放入IOC容器中
    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }



写我们之前自定义的认证的配置,但是现在要OAuth2.0进行认证,所以还需要添加一个新的配置
这个就是配置授权的方式,现在使用了授权码模式进行授权的配置

    //AuthenticationManager对象在OAuth2认证服务中要使用,提前放入IOC容器中
    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

之前写的是web的配置,也就是登录的配置,但是还有一个OAuth2.0颁发token的配置,重新写一个配置,这个配置就是认证服务器里面用OAuth2.0颁发token的配置

OAuth2.0实战案例(二)搭建认证服务,就是这个服务里面就是来颁发token
只要写了这个注解,并且继承了这个,那么这个自己写的类就是OAuth2.0的配置类了
之后就是重写里面的方法,开始在重写的方法里面颁发token
OAuth2.0实战案例(二)搭建认证服务,就是这个服务里面就是来颁发token
里面写什么?
1 数据库连接池对象
因为和OAuth2.0相关的表都在数据库里面,所以配置里面就需要引入数据源
2 认证业务对象
//认证业务对象
@Autowired
private UserService userService;
写了这个就是不仅仅让用户可以直接登录这个服务,也就是单点登录,而且还可以用OAuth2.0进行认证
3授权模式专用对象

//授权模式专用对象
@Autowired
private AuthenticationManager authenticationManager;
之前我们在web配置里面配置了这个授权码的配置,现在就是从哪个里面拿过来用

4//客户端信息来源
//客户端信息来源
@Bean
public JdbcClientDetailsService jdbcClientDetailsService(){
return new JdbcClientDetailsService(dataSource);
}
A系统要有B系统的使用权,A系统要注册到这个B系统,也就是A系统的信息要在B系统里面保存,所以在认证的服务器里面要配置这个信息的来源
5//token保存策略
虽然这个认证的服务是颁发token,但是还要将生成的token保存在数据库,所以要配置一个保存策略
6//授权信息保存策略
B系统给了A系统的什么权限,这个是需要保存在B系统里面的,这个保存的模式是什么,所以需要我们定义

7授权码模式数据来源

以上的这7个只是我们需要用的对象,之后开始使用这些对象进行配置

重写人家的方法

    //指定客户端信息的数据库来源
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(jdbcClientDetailsService());
    }

    //检查token的策略
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.allowFormAuthenticationForClients();
        security.checkTokenAccess("isAuthenticated()");
    }

    //OAuth2的主配置信息,整合上面的所有的配置
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
                .approvalStore(approvalStore())
                .authenticationManager(authenticationManager)
                .authorizationCodeServices(authorizationCodeServices())
                .tokenStore(tokenStore());
    }

OAuth2.0的所有的配置

@Configuration
@EnableAuthorizationServer
public class OauthServerConfig extends AuthorizationServerConfigurerAdapter {

    //数据库连接池对象
    @Autowired
    private DataSource dataSource;

    //认证业务对象
    @Autowired
    private UserService userService;

    //授权模式专用对象
    @Autowired
    private AuthenticationManager authenticationManager;

    //客户端信息来源
    @Bean
    public JdbcClientDetailsService jdbcClientDetailsService(){
        return new JdbcClientDetailsService(dataSource);
    }

    //token保存策略
    @Bean
    public TokenStore tokenStore(){
        return new JdbcTokenStore(dataSource);
    }

    //授权信息保存策略
    @Bean
    public ApprovalStore approvalStore(){
        return new JdbcApprovalStore(dataSource);
    }

    //授权码模式数据来源
    @Bean
    public AuthorizationCodeServices authorizationCodeServices(){
        return new JdbcAuthorizationCodeServices(dataSource);
    }

    //指定客户端信息的数据库来源
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(jdbcClientDetailsService());
    }

    //检查token的策略
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.allowFormAuthenticationForClients();
        security.checkTokenAccess("isAuthenticated()");
    }

    //OAuth2的主配置信息
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
                .approvalStore(approvalStore())
                .authenticationManager(authenticationManager)
                .authorizationCodeServices(authorizationCodeServices())
                .tokenStore(tokenStore());
    }




以上配置完成之后,那么我们的认证服务就完成了。

相关标签: OAuth2.0系列 java