web-dev-qa-db-ja.com

SpringのトークンストアをMySQLファイルとして実装する手順は何ですか?

現在Spring OAuth 2.0 In Memory Token Storeを使用しているアプリケーションがあります。永続化ファイルを使用するには、Spring Security OAuth 2.0 JARを変換する必要がありますサーバーの再起動時にアクセストークンが有効であることを確認するために、メモリ内よりも。SpringOAuth 2.0 JARは、JdbcTokenStoreメソッドを使用してMYSQLデータベースをサポートするルーチンを提供しますが、そのドキュメントを見つけることができません。デフォルトの構成(InMemoryTokenStoreメソッドを使用)を変更して、サポートされているJdbcメソッドを利用する方法を示します。

Spring Security OAuth 2.0 JdbcTokenStoreメソッドを実装し、それを行うために必要な構成の例を提供するか、またはプロセス。インターネットで高低を検索しましたが、そのようなドキュメントは見つかりません。

Spring Securityは既に見つかりましたOAuth 2.0トークンストアのスキーマファイルです。興味がある場合は、テストリソースディレクトリでのみ見つかります。その存在は、Pivo​​talのいずれにも記載されていません。ドキュメンテーションWebサイト必要に応じて、Pivo​​talの残りのソースコードを読むことができますが、このパスを使用しなくても済む人がいることを願っています。

あなたが提供できるあらゆる助けを事前に感謝します。

19

Bean実装クラスをInMemoryTokenStoreからJdbcTokenStoreに変更する必要があります。この変更により、コンストラクターでデータソースを渡す必要もあります。

私はそれをいじりながら、すでにこれを行っています。あなたはそれを見つけることができます ここ

そして春のセキュリティ設定は具体的に変更されます ここ 。 MySqlスキーマは here です。

22
anfab

これは私がやった方法です。

ステップ1:2つのテーブルを作成する(oauth_access_tokenおよびoauth_refresh_token)

CREATE TABLE `oauth_access_token` (
`authentication_id` varchar(255) NOT NULL,
`token_id` varchar(255) NOT NULL,
`token` blob NOT NULL,
`user_name` varchar(255) NOT NULL,
`client_id` varchar(255) NOT NULL,
`authentication` blob NOT NULL,
`refresh_token` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `oauth_access_token`
ADD PRIMARY KEY (`authentication_id`);


CREATE TABLE `oauth_refresh_token` (
`token_id` varchar(255) NOT NULL,
`token` blob NOT NULL,
`authentication` blob NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ステップ2:AuthorizationServerConfigクラスを構成する

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

@Autowired
private AuthenticationManager authenticationManager;

@Autowired
private PasswordEncoder passwordEncoder;

@Autowired
private TokenStore tokenStore;

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

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    clients.inMemory().withClient("my-trusted-client")
            .authorizedGrantTypes("client_credentials", "password","refresh_token")
            .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT").scopes("read", "write", "trust")
            .resourceIds("oauth2-resource")
            .accessTokenValiditySeconds(5000)
            .refreshTokenValiditySeconds(50000)
            .secret(passwordEncoder.encode("secret"));
}

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

}

ステップ3:

@Configuration
public class AppConfig {

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

@Value("${spring.datasource.driver-class-name}")
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());
}
}
2
VK321