OAuth + Security - 5 - Token儲存升級(資料庫、Redis)
阿新 • • 發佈:2020-06-08
> PS:此文章為系列文章,建議從第一篇開始閱讀。
在我們之前的文章中,我們當時獲取到Token令牌時,此時的令牌時儲存在記憶體中的,這樣顯然不利於我們程式的擴充套件,所以為了解決這個問題,官方給我們還提供了其它的方式來儲存令牌,儲存到資料庫或者Redis中,下面我們就來看一看怎麼實現。
#### 不使用Jwt令牌的實現
- 儲存到資料庫中(JdbcTokenStore)
使用資料庫儲存方式之前,我們需要先準備好對應的表。Spring Security OAuth倉庫可以找到相應的指令碼:[https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql)。該指令碼為HSQL,所以需要根據具體使用的資料庫進行相應的修改,以MySQL為例,並且當前專案中,只需要使用到oauth_access_token和oauth_refresh_token資料表,所以將建立這兩個庫表的語句改為MySQL語句:
```
CREATE TABLE oauth_access_token (
token_id VARCHAR ( 256 ),
token BLOB,
authentication_id VARCHAR ( 256 ),
user_name VARCHAR ( 256 ),
client_id VARCHAR ( 256 ),
authentication BLOB,
refresh_token VARCHAR ( 256 )
);
CREATE TABLE oauth_refresh_token (
token_id VARCHAR ( 256 ),
token BLOB, authentication BLOB
);
```
然後我們需要去配置對應的認證伺服器,主要就是修改之前文章中TokenConfigure類中的tokenStore()方法:
```
// 同時需要注入資料來源
@Autowired
private DataSource dataSource;
@Bean
public TokenStore tokenStore() {
return new JdbcTokenStore(dataSource);
}
```
同時需要新增jdbc的依賴:
```
org.springframework.boot
spring-boot-starter-jdbc
```
認證伺服器中的配置保持本系列第一章的配置不變,此處不再贅述。
> 其中若有不理解的地方,請參考該系列的第一篇文章
關於資料來源的補充:
在我們專案中配置的資料來源,可能不一定是使用的官方提供的格式,比如我們自定義的格式,或者使用第三方的資料來源,那麼我們如何去配置呢?這裡以mybatis-plus的多資料來源為例:
```
@Configuration
@EnableAuthorizationServer
public class FebsAuthorizationServerConfigure extends AuthorizationServerConfigurerAdapter {
......
@Autowired
private DynamicRoutingDataSource dynamicRoutingDataSource;
@Bean
public TokenStore tokenStore() {
DataSource dimplesCloudBase = dynamicRoutingDataSource.getDataSource("dimples_cloud_base");
return new JdbcTokenStore(febsCloudBase);
}
......
}
```
然後啟動專案,重新獲取Token進行測試,能正確的獲取到Token:
![image](https://images.cnblogs.com/cnblogs_com/reroyalup/1776738/o_2006071112554.png)
我們檢視資料中,看是否已經存入相關資訊到資料庫中:
![image](https://images.cnblogs.com/cnblogs_com/reroyalup/1776738/t_2006071113003.png?a=1591528475702)
- 儲存到redis(RedisTokenStore)
令牌儲存到redis中相比於儲存到資料庫中來說,儲存redis中,首先在效能上有一定的提升,其次,令牌都有有效時間,超過這個時間,令牌將不可再用,而redis的可以給對應的key設定過期時間,完美切合需求,所有令牌儲存到redis中也是一種值得使用的方法。
首先,我們需要在專案中新增redis依賴,同時配置redis
```
org.springframework.boot
spring-boot-starter-data-redis
```
新建配置類RedisConfigure
```
@Configuration
public class RedisConfigure{
@Bean
@ConditionalOnClass(RedisOperations.class)
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer