前面我們講解了一些列的CAS文章,對CAS有了很多瞭解。今天我們講解一個現在服務常用的REST協議來完成CAS的登錄、認證,不需要我們手動登錄跳轉到CAS的登錄頁面就可以完成CAS的一些列操作。
我們知道CAS認證支持包括多種協議去認證,包括CAS、OAuth、SAML1、SAML2、REST Protocol等協議,這裏我們採用REST協議去獲取TGT,然後獲取到TGT後獲取到ST,最後拿到ST後再去訪問服務。
一、認證服務
首先我們加入Rest服務依賴:
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-rest-tokens</artifactId>
<version>${cas.version}</version>
</dependency>
開啓Rest認證方式,我們在前面的文章介也紹過CAS單點登錄(三)——多種認證方式。
在application.properties中,我們配置restful的鏈接。
##
# Rest配置
#
cas.authn.rest.uri=http://localhost:8088/login
cas.authn.rest.name=
這裏需要注意,這個是自定義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());
}
}
其他操作呢?沒了,就是如此簡單,啓動服務,接下來就是Restful操作。
1、獲取TGT票據
官方文檔給的操作如下:
POST /cas/v1/tickets HTTP/1.0
'Content-type': 'Application/x-www-form-urlencoded'
username=battags&password=password&additionalParam1=paramvalue
除了用戶名和密碼外,當然還可以傳遞其他參數,這裏我們原有驗證碼的,也可以通過該方式傳遞進去。
這裏我們使用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}
這裏有一個參數,service就是客戶端地址,爲POST請求。
如下:
我們拿到ST = ST-5-0bAcjZ92h6QjLYx7WJ8MFtenXakanumbrelladeiMac
後,再通過它去訪問具體服務。
3、通過ST票據去訪問服務
CAS默認的ST過期策略是使用一次或者超過10秒,這個對咱們做測試來說有點短所以在application.properties中更改如下。
##
# Ticket過期設置
#
cas.ticket.st.numberOfUses=1
cas.ticket.st.timeToKillInSeconds=60
使用瀏覽器訪問https://client.anumbrella.net:9443/?ticket=ST-5-0bAcjZ92h6QjLYx7WJ8MFtenXakanumbrelladeiMac
路徑,可以發現不用登錄直接進入應用。
二、票據驗證以及銷燬
1、驗證
官方提供restful接口來驗證票據,這裏是通過cas協議來驗證,路徑爲/p3/serviceValidate,具體詳情,如下。
GET /cas/p3/serviceValidate?service={service url}&ticket={service ticket}
因爲票據是一次性使用的,所以我們再申請一個ticket,並進行驗證。
如下,可以看到具體驗證的信息。
除了票據的驗證,還有TGT的有效性驗證。
GET /cas/v1/tickets/TGT-fdsjfsdfjkalfewrihfdhfaie HTTP/1.0
比如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
比如,剛纔的票據TGT-2-CbkNRl2u4WS3-WVbtGhJCYBoxbVwzC2SPEj9DEAN5Gbd2f4YWaBkJrFTdBcivytGGcoanumbrelladeiMac
,我們想退出使它無效,發起一個DELETE請求即可。
然後我們再去驗證,可以發現TGT無效,不在了,刷新剛纔登錄的應用,也會自動退出。
代碼實例:Chapter9