在一次項目的技術選型中,選擇了easyui+cas+shiro+spring的組合,cas實現了單點登錄,這使得在一個應用中嵌入另一個應用的頁面來展示數據所涉及到的授權方面變得簡單。
由於shiro在判斷登錄成功后會自動跳轉到登錄前訪問的頁面,這就使得在easyui這樣的框架下ajax異步加載某個片段頁面或iframe頁面時正好登錄超時,進行登錄后就直接跳轉到了那一個片段頁面或iframe頁面的url上了,導致了系統使用上不太友好。
於是決定在每次登錄成功后都跳轉回首頁,這時需要重寫shiro官方提供的CasFilter,在onLoginSuccess方法里改用
WebUtils.getAndClearSavedRequest(request);
清除掉其所記錄的登錄前訪問的url信息。
在另外一個同樣使用cas服務的應用中,需要iframe引用訪問我當前應用的某個需要授權訪問的頁面,這時跨應用的單點登錄也是一次登錄的過程,由於我上面對當前應用的登錄修改成了登錄成功就直接跳轉至首頁,結果導致訪問另外一個應用引用我當前應用的頁面時,iframe里引用的頁面直接跳轉到首頁了。
基於上面出現的問題,我決定在進行登錄時,由cas返回ticket的同時,也要返回一個標記表明是通過登錄頁正常登錄的還是通過ticket進行單點登錄的,於是就有了我下面所研究出的CAS登錄后回傳除了ticket參數以外的其他自定義參數。
一、重寫CAS的以下這幾個類:
SamlServic類和SimpleWebApplicationServiceImpl類都是在CAS原來的類的基礎上新增getResponse的重載方法:
CasArgumentExtractor類和SamlArgumentExtractor類的extractServiceInternal方法都是返回上面自己寫的類的實例。
SendTicketGrantingTicketAction類主要是添加一個參數標識(之所以在這添加是根據CAS的單點登錄訪問流程決定的):
二、修改
配置文件里的
改成自己所寫的類。
三、修改
配置文件里的
改成自己的類。
四、修改
配置文件里的
改成自己的類。
五、配置文件
里增加自己的條件判斷
這是本人兩三年前的干貨了,當時把這步驟只是簡單的記錄到word文檔里,如有不正確的地方,歡迎指正。
注:文中提到的CAS版本是3.5.2