相關(guān)文章
1教翩、spring boot oauth2單點登錄(一)-前后端分離例子
2笔咽、spring boot oauth2單點登錄(二)-客戶端信息存儲
3、spring boot oauth2單點登錄(三)-token存儲方式
4沿量、spring boot oauth2單點登錄(四)-code存儲方式
源碼地址
后端:https://gitee.com/fengchangxin/sso
前端:https://gitee.com/fengchangxin/sso-page
準備
后端:三個spring boot應(yīng)用颂砸,auth(授權(quán)管理)羡洁,client1(客戶端應(yīng)用1),client2(客戶端應(yīng)用2)苛蒲。
前端:三個Vue項目卤橄,auth,client1臂外,client2窟扑。分別對應(yīng)三個后端應(yīng)用。
工具:nginx
域名:oauth.com漏健,client1.com嚎货,client2.com,分別對應(yīng)三個系統(tǒng)蔫浆。
開發(fā)環(huán)境:先在host文件添加上面三個域名殖属。
端口:
后端服務(wù)auth(8080),client1(8081)瓦盛,client2(8082)忱辅。
前端auth(8083)七蜘,client1(8084),client2(8085)墙懂。
依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
測試地址:
client1:http://client1.com/client1Page/#/home
client2:http://client2.com/client2Page/#/home
登錄用戶:admin/123456
備注:此篇文章對應(yīng)的授權(quán)管理應(yīng)用:auth-code
授權(quán)碼code存儲
框架默認存儲在內(nèi)存(InMemoryAuthorizationCodeServices)橡卤,單機應(yīng)用沒問題,若應(yīng)用是集群部署损搬,就可能會出現(xiàn)問題碧库。而框架已經(jīng)提供了兩種實現(xiàn)方式:內(nèi)存(InMemoryAuthorizationCodeServices),數(shù)據(jù)庫(JdbcAuthorizationCodeServices)巧勤。
1.1數(shù)據(jù)庫存儲(JdbcAuthorizationCodeServices)
首先先建好oauth_code表嵌灰,然后在AuthorizationServerEndpointsConfigurer配置就可以了,注意的是在測試時oauth_code的數(shù)據(jù)再驗證完之后會被刪除颅悉,當看到表中沒數(shù)據(jù)時并不是配置不生效沽瞭,而是被刪除了,可以debug來跟蹤剩瓶。
@Autowired
private DataSource dataSource;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(new RedisTokenStore(redisConnectionFactory));
endpoints.authorizationCodeServices(new JdbcAuthorizationCodeServices(dataSource));
}
1.2自定義
如果不想存在數(shù)據(jù)庫驹溃,或者不想用默認的數(shù)據(jù)庫表,那也可以繼承RandomValueAuthorizationCodeServices類延曙,來實現(xiàn)自定義豌鹤。例如下面例子使用Redis來存儲:
@Service
public class CodeStoreService extends RandomValueAuthorizationCodeServices {
@Autowired
private RedisTemplate redisTemplate;
private static final String CODE_KEY = "auth:code:%s";
/**
* 存儲code
*
* @param code
* @param authentication
*/
@Override
protected void store(String code, OAuth2Authentication authentication) {
String key = String.format(CODE_KEY, code);
System.out.println("保存code:" + code);
//保存30分鐘
redisTemplate.opsForValue().set(key, SerializationUtils.serialize(authentication), 30, TimeUnit.MINUTES);
}
/**
* 刪除code
*
* @param code
* @return
*/
@Override
protected OAuth2Authentication remove(String code) {
String key = String.format(CODE_KEY, code);
Object value = redisTemplate.opsForValue().get(key);
if (value != null) {
System.out.println("刪除code:" + code);
redisTemplate.delete(key);
return SerializationUtils.deserialize((byte[]) value);
}
return null;
}
}
在AuthorizationServerEndpointsConfigurer配置自定義類。
//redis存儲
@Autowired
private CodeStoreService codeStoreService;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(new RedisTokenStore(redisConnectionFactory));
endpoints.authorizationCodeServices(codeStoreService);
}