【SpringSecurityOAuth2客户端模式集成Springboot项目】

SpringSecurityOAuth2客户端模式集成Springboot项目

一、导入maven依赖

        <!--oauth-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>2.3.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth.boot</groupId>
            <artifactId>spring-security-oauth2-autoconfigure</artifactId>
            <version>2.3.4</version>
        </dependency>

二、配置类继承AuthorizationServerConfigurerAdapter

/**
 * 认证授权配置
 * @author ry
 * @date 2021/11/17 14:15
 */
@Configuration
@EnableAuthorizationServer
public class Oauth2ServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private DataSource dataSource;
    @Autowired
    private AuthenticationManager authenticationManager;

    /**
     * 从数据库中查询出客户端信息
     * @return
     */
    @Bean
    public JdbcClientDetailsService clientDetailsService() {
        JdbcClientDetailsService detailsService = new JdbcClientDetailsService(dataSource);
        detailsService.setPasswordEncoder(new BCryptPasswordEncoder());
        return detailsService;
    }

    /**
     * token保存至数据库
     * @return
     */
    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource);
        // 如要保存至内存可以切换
        //return new InMemoryTokenStore();
    }

    /**
     * 授权信息保存至数据库
     * @return
     */
    @Bean
    public ApprovalStore approvalStore() {
        return new JdbcApprovalStore(dataSource);
    }

    /**
     * 授权码模式专用对象
     * @return
     */
    //@Bean
    //public AuthorizationCodeServices authorizationCodeServices() {
    //    return new JdbcAuthorizationCodeServices(dataSource);
    //}

    /**
     * 指定客户端登录信息来源
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        //从数据库取数据
        clients.withClientDetails(clientDetailsService());
    }

    /**
     * 检测token的策略
     */
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        //允许form表单客户端认证,允许客户端使用client_id和client_secret获取token
        security.allowFormAuthenticationForClients()
                //通过验证返回token信息
                .checkTokenAccess("isAuthenticated()")
                // 获取token请求不进行拦截
                .tokenKeyAccess("permitAll()")
                // 允许表单认证
                .allowFormAuthenticationForClients()
                .passwordEncoder(new BCryptPasswordEncoder());
    }

    /**
     * OAuth2的主配置信息
     * @param endpoints
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
                //指定授权信息保存至数据库
                .approvalStore(approvalStore())
                
                //指定授权管理器
                .authenticationManager(authenticationManager)
                
                //授权码模式使用
                //.authorizationCodeServices(authorizationCodeServices())
                //指定客户端token保存位置等信息
                .tokenServices(tokenServices())
                //指定请求方式
                .allowedTokenEndpointRequestMethods(HttpMethod.POST);
                //.reuseRefreshTokens(true);
    }
    @Bean
    public AuthorizationServerTokenServices tokenServices(){
        DefaultTokenServices tokenServices = new DefaultTokenServices();
        //设置客户端详情
        tokenServices.setClientDetailsService(clientDetailsService());
        设置token自动刷新
        //tokenServices.setSupportRefreshToken(true);
        储存token
        tokenServices.setTokenStore(tokenStore());
        设置token过期时间为12小时(适用于token储存到内存模式)
        //tokenServices.setAccessTokenValiditySeconds(43200);
        //tokenServices.setRefreshTokenValiditySeconds(72000);
        return tokenServices;
    }

}

注意:测试前要新建两张表

1.储存客户端详情表:配置客户端的信息
CREATE TABLE oauth_client_details (
client_id varchar(48) NOT NULL,
resource_ids varchar(256) DEFAULT NULL,
client_secret varchar(256) DEFAULT NULL,
scope varchar(256) DEFAULT NULL,
authorized_grant_types varchar(256) DEFAULT NULL,
web_server_redirect_uri varchar(256) DEFAULT NULL,
authorities varchar(256) DEFAULT NULL,
access_token_validity int(11) DEFAULT NULL,
refresh_token_validity int(11) DEFAULT NULL,
additional_information varchar(4096) DEFAULT NULL,
autoapprove varchar(256) DEFAULT NULL,
PRIMARY KEY (client_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.储存token信息表:
CREATE TABLE oauth_access_token (
token_id varchar(255) DEFAULT NULL,
token blob,
authentication_id varchar(255) DEFAULT NULL,
user_name varchar(255) DEFAULT NULL,
client_id varchar(255) DEFAULT NULL,
authentication blob,
refresh_token varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

三、配置类继承WebSecurityConfigurerAdapter

/**
 * 资源安全配置
 * @author ry
 * @date 2021/11/17 14:31
 */
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

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

三、配置类继承ResourceServerConfigurerAdapter

/**
 * 认证授权配置
 *
 * @author ry
 * @date 2021/11/18 9:32
 */
@Configuration
@EnableResourceServer
public class Oauth2ResourceServer extends ResourceServerConfigurerAdapter {

    private static final String TEST= "test";

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        // 指定资源可以访问,有多个资源可以继续添加,对应表里的字段值,表里多个字段值用逗号隔开
        resources.resourceId(TEST).stateless(true);
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
        http.authorizeRequests()
                //指定不同请求方式访问资源所需要的权限。
                .antMatchers(HttpMethod.POST, "/test1").access("#oauth2.hasScope('test1')")
                .antMatchers(HttpMethod.POST, "/test2").access("#oauth2.hasScope('test2')")
                .and()
                .headers().addHeaderWriter((request, response) -> {
            response.addHeader("Access-Control-Allow-Origin", "*");//允许跨域
            if (request.getMethod().equals("OPTIONS")) {//如果是跨域的预检请求,则原封不动向下传达请求头信息
                response.setHeader("Access-Control-Allow-Methods", request.getHeader("Access-Control-Request-Method"));
                response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
            }
        });
    }
}

四、postman测试

在这里插入图片描述

五、获取到token后,请求头携带token访问指定的资源即可

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot 中的 OAuth 客户端配置需要在配置文件中进行配置,一般使用 application.properties 或 application.yml 文件。常用的配置有: 1. 客户端 ID 和密钥:spring.security.oauth2.client.client-id 和 spring.security.oauth2.client.client-secret 2. 认证服务器地址:spring.security.oauth2.client.provider.{provider}.authorization-uri 和 spring.security.oauth2.client.provider.{provider}.token-uri 3. 回调地址:spring.security.oauth2.client.registration.{registration}.redirect-uri 其中 {provider} 是服务提供商的名称,如 google、github 等;{registration} 是当前应用在认证服务器上的注册名称。 具体配置可以参考 Spring Boot 官方文档中的相关章节:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-security-oauth2-client ### 回答2: Spring Boot中的OAuth客户端配置是指在使用Spring Boot框架开发应用程序时,如何配置应用程序作为OAuth 2.0的客户端来实现授权和认证功能。 在Spring Boot中配置OAuth客户端通常需要以下步骤: 1. 添加依赖:在`pom.xml`文件中添加相应的依赖,例如可以使用`spring-boot-starter-oauth2-client`。 2. 配置属性:在`application.properties`或`application.yml`文件中配置OAuth客户端的属性,例如设置授权服务器的URL、客户端ID和密钥等。 3. 创建认证回调URL:在应用程序中创建一个认证回调URL,在该URL上回接收来自授权服务器的授权码或访问令牌等信息。 4. 配置认证配置类:创建一个OAuth2的配置类,用于配置认证服务器的信息和认证管理器等。 5. 配置安全规则:根据应用程序的需求,可以配置一些安全规则,例如哪些URL需要进行认证、哪些URL可以匿名访问等。 6. 使用OAuth客户端:在需要使用OAuth客户端的地方,例如请求API资源时,可以使用`RestTemplate`或`Feign Client`等工具进行请求,并在请求中携带认证信息。 以上是Spring Boot中配置OAuth客户端的一般步骤,当然具体的配置和使用方式可能会根据实际需求有所不同。通过合理的配置,我们可以在Spring Boot应用程序中使用OAuth 2.0协议来实现用户认证和授权等功能。 ### 回答3: 在Spring Boot中配置OAuth客户端实际上是配置一个被保护资源的客户端应用程序,以便与OAuth 2.0服务器进行交互。以下是配置Spring BootOAuth客户端的步骤: 1. 添加依赖:在项目的pom.xml文件中添加Spring Security OAuth2客户端的相关依赖,例如spring-security-oauth2-autoconfigure和spring-security-oauth2-client。 2. 创建应用程序配置:在application.properties或application.yml文件中设置应用程序的配置,包括OAuth服务提供商的URL、客户端ID和客户端密钥等信息。 3. 配置Security:在Spring Security配置类中,使用@EnableOAuth2Client注解启用OAuth2客户端,并配置ClientRegistrationRepository bean,用于存储和管理客户端应用程序的注册信息。 4. 配置客户端注册信息:在应用程序配置类中,使用@Bean注解创建ClientRegistration对象,指定客户端应用程序的注册信息,包括客户端ID、客户端密钥、授权范围、授权服务器地址等。 5. 配置授权规则:使用@EnableWebSecurity注解将应用程序的安全性配置为基于OAuth2的安全协议。定义的授权规则可以通过.antMatchers()和.permitAll()等来配置。 6. 处理回调URL:配置回调URL,用于接收授权服务器返回的授权码,并将其交给授权提供商进行令牌交换。 7. 配置用户信息获取:使用UserDetailsService接口的实现类,获取授权提供商返回的用户信息,并进行相应的处理。 通过以上步骤,我们就可以在Spring Boot中成功配置一个OAuth客户端,使得应用程序能够与OAuth 2.0服务器进行交互,获取受保护资源的授权。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值