CAS單點登錄(十)——通過Restful協議請求認證和退出
前面我們講解了一些列的CAS文章,對CAS有了很多了解。今天我們講解一個現在服務常用的REST協議來完成CAS的登錄、認證,不需要我們手動登錄跳轉到CAS的登錄頁面就可以完成CAS的一些列操作。
我們知道CAS認證支持包括多種協議去認證,包括CAS、OAuth、SAML1、SAML2、REST Protocol等協議,這里我們采用REST協議去獲取TGT,然后獲取到TGT后獲取到ST,最后拿到ST后再去訪問服務。
一、認證服務
首先我們加入Rest服務依賴:
<!-- Restful support -->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-rest</artifactId>
<version>${cas.version}</version>
</dependency>
1
2
3
4
5
6
開啟Rest認證方式,我們在前面的文章介也紹過CAS單點登錄(三)——多種認證方式。
在application.properties中,我們配置restful的鏈接。
##
# Rest配置
#
cas.authn.rest.uri=http://localhost:8088/login
cas.authn.rest.name=
1
2
3
4
5
這里需要注意,這個是自定義Rest認證配置的相關參數,與這里是通過公開方法RESTful來獲取票證授予票證然后使用它來獲取服務票證來實現的是不一樣的。
所以這里我們可以不用配置Rest認證配置的參數,這里提出來為了區分一下區別。
注意:這里通過REST協議去獲取TGT,暫時支持用戶名和密碼,我們在前面demo應用中加入了驗證碼的,因此繼續使用該demo時,需要在CustomAuthenticationConfiguration配置中啟用CustomUsernamePasswordAuthentication來實現認證。如下:
/**
* @author anumbrella
*/
@Configuration("customAuthenticationConfiguration")
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class CustomAuthenticationConfiguration implements AuthenticationEventExecutionPlanConfigurer {
@Autowired
private CasConfigurationProperties casProperties;
@Autowired
@Qualifier("servicesManager")
private ServicesManager servicesManager;
@Bean
public AuthenticationHandler myAuthenticationHandler() {
// 參數: name, servicesManager, principalFactory, order
// 定義為優先使用它進行認證
return new CustomUsernamePasswordAuthentication(CustomUsernamePasswordAuthentication.class.getName(),
servicesManager, new DefaultPrincipalFactory(), 1);
// return new CustomerHandlerAuthentication(CustomerHandlerAuthentication.class.getName(),
// servicesManager, new DefaultPrincipalFactory(), 1);
}
@Override
public void configureAuthenticationExecutionPlan(final AuthenticationEventExecutionPlan plan) {
plan.registerAuthenticationHandler(myAuthenticationHandler());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
其他操作呢?沒了,就是如此簡單,啟動服務,接下來就是Restful操作。
1、獲取TGT票據
官方文檔給的操作如下:
POST /cas/v1/tickets HTTP/1.0
'Content-type': 'Application/x-www-form-urlencoded'
username=battags&password=password&additionalParam1=paramvalue
1
2
3
除了用戶名和密碼外,當然還可以傳遞其他參數,這里我們原有驗證碼的,也可以通過該方式傳遞進去。
這里我們使用POSTMAN來模擬一下:
這里的service參數就是其他參數,不是必填的。是一個可選的參數,因此不用必須傳過去,如果像我們之前像服務認證有驗證碼一樣,可以自己實現通過這里傳遞過去。
2、用TGT申請ST票據
我們在上面獲取到TGT后,然后通過https://sso.anumbrella.net:8443/cas/v1/tickets/TGT-2-CbkNRl2u4WS3-WVbtGhJCYBoxbVwzC2SPEj9DEAN5Gbd2f4YWaBkJrFTdBcivytGGcoanumbrelladeiMac,就是上面獲取的路徑去獲取ST票據。
POST /cas/v1/tickets/{TGT id} HTTP/1.0
service={form encoded parameter for the service url}
1
2
3
這里有一個參數,service就是客戶端地址,為POST請求。
如下:
我們拿到ST = ST-5-0bAcjZ92h6QjLYx7WJ8MFtenXakanumbrelladeiMac后,再通過它去訪問具體服務。
3、通過ST票據去訪問服務
CAS默認的ST過期策略是使用一次或者超過10秒,這個對咱們做測試來說有點短所以在application.properties中更改如下。
##
# Ticket過期設置
#
cas.ticket.st.numberOfUses=1
cas.ticket.st.timeToKillInSeconds=60
1
2
3
4
5
使用瀏覽器訪問https://client.anumbrella.net:9443/?ticket=ST-5-0bAcjZ92h6QjLYx7WJ8MFtenXakanumbrelladeiMac路徑,可以發現不用登錄直接進入應用。
二、票據驗證以及銷毀
1、驗證
官方提供restful接口來驗證票據,這里是通過cas協議來驗證,路徑為/p3/serviceValidate,具體詳情,如下。
GET /cas/p3/serviceValidate?service={service url}&ticket={service ticket}
1
因為票據是一次性使用的,所以我們再申請一個ticket,並進行驗證。
如下,可以看到具體驗證的信息。
除了票據的驗證,還有TGT的有效性驗證。
GET /cas/v1/tickets/TGT-fdsjfsdfjkalfewrihfdhfaie HTTP/1.0
1
比如TGT為:TGT-2-CbkNRl2u4WS3-WVbtGhJCYBoxbVwzC2SPEj9DEAN5Gbd2f4YWaBkJrFTdBcivytGGcoanumbrelladeiMac;
訪問路徑https://sso.anumbrella.net:8443/cas/v1/tickets/TGT-2-CbkNRl2u4WS3-WVbtGhJCYBoxbVwzC2SPEj9DEAN5Gbd2f4YWaBkJrFTdBcivytGGcoanumbrelladeiMac來進行驗證
2、退出
在CAS中還提供了銷毀TGT的請求,發起一個DELETE請求即可。
DELETE /cas/v1/tickets/TGT-fdsjfsdfjkalfewrihfdhfaie HTTP/1.0
1
比如,剛才的票據TGT-2-CbkNRl2u4WS3-WVbtGhJCYBoxbVwzC2SPEj9DEAN5Gbd2f4YWaBkJrFTdBcivytGGcoanumbrelladeiMac,我們想退出使它無效,發起一個DELETE請求即可。
然后我們再去驗證,可以發現TGT無效,不在了,刷新剛才登錄的應用,也會自動退出。
代碼實例:Chapter9
參考
手把手教Apereo CAS5.2.3 Server端開啟restful驗證
https://apereo.github.io/cas/5.3.x/installation/Configuration-Properties.html#service-tickets-behavior
https://apereo.github.io/cas/5.3.x/protocol/Protocol-Overview.html
點贊 1
————————————————
版權聲明:本文為CSDN博主「Anumbrella」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Anumbrella/article/details/88912964