前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OAuth2.0实战案例(二)搭建认证服务,就是这个服务里面就是来颁发token

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

作者头像
一写代码就开心
发布2020-11-20 14:23:26
1.1K0
发布2020-11-20 14:23:26
举报
文章被收录于专栏:java和python

我们的整个项目就是B系统,之前已经创建了资源服务,意思是以后想要访问资源服务里面的东西,要被OAuth2.0管理。

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

认证服务的创建

1 导入依赖 2 写yml配置

3 认证的配置

代码语言:javascript
复制
@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进行认证,所以还需要添加一个新的配置 这个就是配置授权的方式,现在使用了授权码模式进行授权的配置

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

之前写的是web的配置,也就是登录的配置,但是还有一个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个只是我们需要用的对象,之后开始使用这些对象进行配置

重写人家的方法

代码语言:javascript
复制
    //指定客户端信息的数据库来源
    @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的所有的配置

代码语言:javascript
复制
@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());
    }

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 认证服务的创建
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档