Springboot与Spring的OAuth2(Springboot with Spring OA

2019-10-30 02:30发布

我在使用Spring引导和春季安全的OAuth使用JDBC客户端支持我的应用程序中实现了OAuth2。

我可以生成令牌,当我做一个POST请求HTTP://本地主机:8080 /的OAuth /令牌我得到这样一个有效的回应:

{
    "access_token": "359e93b2-555a-477b-9a65-e5062314fc23",
    "token_type": "bearer",
    "refresh_token": "6fd1ae31-8129-4729-a86b-e756c453a58a",
    "expires_in": 899,
    "scope": "read"
}

现在的怪,这是,我不能在数据库中找到任何地方该令牌。 如果我再拍请求/ OAuth的/令牌我得到同样的道理,但与较低的值expires_in预期。 我得到这个令牌信息必须存储在某个地方的结论,但我不能找到它。

01:24:41    SELECT * FROM dummy.oauth_access_token LIMIT 0, 1000    0 row(s) returned   0.000 sec / 0.000 sec

所有的OAuth相关的表是空的,除了oauth_client_details其中有客户的详细信息来生成令牌。

这里是我的代码。

AuthServerOAuth2Config

@Configuration
public class AuthServerOAuth2Config extends AuthorizationServerConfigurerAdapter {

    private final AuthenticationManager authenticationManager;
    private final AppConfig appConfig;

    @Autowired
    public AuthServerOAuth2Config(AuthenticationManager authenticationManager, AppConfig appConfig) {
        this.authenticationManager = authenticationManager;
        this.appConfig = appConfig;
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(appConfig.dataSource());
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.checkTokenAccess("permitAll()");
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }
}

AppConfig的类

@Configuration
@PropertySource(value = "classpath:application.properties")
public class AppConfig {

    @Value("${spring.datasource.url}")
    private String datasourceUrl;

    @Value("${spring.database.driverClassName}")
    private String dbDriverClassName;

    @Value("${spring.datasource.username}")
    private String dbUsername;

    @Value("${spring.datasource.password}")
    private String dbPassword;

    @Bean
    public DataSource dataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(dbDriverClassName);
        dataSource.setUrl(datasourceUrl);
        dataSource.setUsername(dbUsername);
        dataSource.setPassword(dbPassword);

        return dataSource;
    }

    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource());
    }
}

下面是我的情况下的pom.xml它的任何帮助,找到为什么没有令牌持久化到数据库。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
    <relativePath/>
    <!-- lookup parent from repository -->
</parent>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <!-- Defining which version of Spring Framework we are using -->
    <spring-cloud.version>Dalston.SR1</spring-cloud.version>
</properties>

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-oauth2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-aws-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.6.1</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
    </dependency>
</dependencies>

我的问题是,为什么在生成的令牌不被保存到mysql数据库,我该如何解决?

Answer 1:

春季安全的OAuth 2使用的内存中执行默认令牌存储装置的,看到的OAuth 2开发人员指南 :

在创建AuthorizationServerTokenServices实现,你可能要考虑使用DefaultTokenServices其具有可以插入到更改访问令牌的格式和存储许多策略。 默认情况下,它通过创建随机值令牌和处理一切,除了它委托给令牌的持久性TokenStore 。 默认存储是一个内存中执行,但也有一些其他的实现。 下面是与他们每个人的一些讨论的说明

  • 默认InMemoryTokenStore是单个服务器(即低流量,并没有热插拔到备份服务器发生故障的情况下),完全正常。 大多数项目可以从这里开始,也许这样操作的开发模式,可以很容易地启动了服务器没有依赖关系。

您可以更改使用的实现与令牌存储装置的AuthorizationServerEndpointsConfigurer#tokenStore

修改后的授权服务器端点配置:

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints
         .authenticationManager(authenticationManager)
         .tokenStore(appConfig.tokenStore());
}


Answer 2:

缺省情况下,在存储器令牌存储被配置。 如果你想坚持重启之间的标记,那么你需要配置持久令牌存储​​装置。

请找到下面的工作实例。 : https://github.com/spring-projects/spring-security-oauth/tree/master/tests/annotation/jdbc



文章来源: Springboot with Spring OAuth2