1、下載 CAS 5.3 源碼:
git clone https://github.com/apereo/cas-overlay-template.git
由於以上命令會拷貝 CAS 的最新版本,如需切換到歷史版本,可執行如下操作:
1)cd 到該項目下;
2)git log 查看提交記錄,找到想要的提交記錄,粘貼對應的哈希值;
3)執行 git checkout 哈希值;
這時本地的代碼就會變成你想要的那個版本的代碼。
2、將下載的源碼導入 Idea:
(1)目錄結構如下(CAS5.3 采用 maven 項目結構):
(2)打開 POM.XML 文件,更換 repositories :
<!-- 注釋以下部分,因為使用的是國外的倉庫,下載速度較慢 --> <!--<repositories> <repository> <id>sonatype-releases</id> <url>http://oss.sonatype.org/content/repositories/releases/</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> <repository> <id>sonatype-snapshots</id> <url>https://oss.sonatype.org/content/repositories/snapshots/</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>false</enabled> </releases> </repository> <repository> <id>shibboleth-releases</id> <url>https://build.shibboleth.net/nexus/content/repositories/releases</url> </repository> </repositories>--> <!-- 添加阿里的倉庫 --> <repositories> <repository> <id>central</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <!-- 是否開啟發布版構件下載 --> <releases> <enabled>true</enabled> </releases> <!-- 是否開啟快照版構件下載 --> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
3、對源碼進行打包:
打包完成后會生成一個 target 目錄:
4、將打包后的 cas 文件夾復制到 tomcat 的 webapps 目錄下:
5、修改CAS服務端配置文件:
(1)在 cas\WEB-INF\classes 目錄的 application.properties 添加如下的內容:
# 自定義cas 登錄用戶名和密碼為 admin
#cas.authn.accept.users=casuser::Mellon
cas.authn.accept.users=admin::admin
# 兼容 Http 協議
cas.tgc.secure=false
# 開啟識別Json文件,默認false
cas.serviceRegistry.initFromJson=true
# 允許退出登錄后重定向到其他頁面
cas.logout.followServiceRedirects=true
(2)在 cas\WEB-INF\classes\services 目錄下的 HTTPSandIMAPS-10000001.json:
修改內容如下,即添加http
"serviceId" : "^(https|http|imaps)://.*",
6、啟動 tomcat 查看是否可以啟動 CAS Server:
如上,已成功訪問 CAS Server 登錄頁。
7、 CAS 客戶端配置:
(1)項目結構:
項目結構為 maven 多模塊工程,其中sp-common模塊為公用模塊;sp-member 為會員模塊;sp-order 為訂單模塊。
(2)POM.XML 依賴:
<dependency> <groupId>net.unicon.cas</groupId> <artifactId>cas-client-autoconfig-support</artifactId> <version>2.1.0-GA</version> </dependency>
(3)application.yml 配置:
1)客戶端 sp-member 模塊配置如下:
server: port: 8081 # 配置 cas server 信息 cas: # cas服務端的地址 server-url-prefix: http://localhost:8080/cas # cas服務端的登錄地址 server-login-url: http://localhost:8080/cas/login # 當前服務器的地址(客戶端) client-host-url: http://localhost:8081 # Ticket校驗器使用Cas30ProxyReceivingTicketValidationFilter validation-type: cas3
2)客戶端 sp-order 模塊配置如下:
server: port: 8082 # 配置 cas server 信息 cas: # cas服務端的地址 server-url-prefix: http://localhost:8080/cas # cas服務端的登錄地址 server-login-url: http://localhost:8080/cas/login # 當前服務器的地址(客戶端) client-host-url: http://localhost:8082 # Ticket校驗器使用Cas30ProxyReceivingTicketValidationFilter validation-type: cas3
8、進行客戶端測試:
(1)客戶端 sp-member模塊配置如下:
MemberController 類:
package member.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @Controller public class MemberController { @RequestMapping("/test") @ResponseBody public String test(HttpServletRequest request) { return "member"; } /** * 退出 * @param request * @return */ @RequestMapping("/logout") public String logout(HttpServletRequest request) { HttpSession session = request.getSession(); session.invalidate(); return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8081/logoutSuccess"; } /** * 退出成功頁 * @return */ @RequestMapping("/logoutSuccess") @ResponseBody public String logoutSuccess() { return "member logoutSuccess"; } }
StartMember8081類(啟動類):
package member; /** * 會員服務啟動類 */ import net.unicon.cas.client.configuration.EnableCasClient; import org.jasig.cas.client.authentication.AuthenticationFilter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import java.util.HashMap; import java.util.Map; @EnableCasClient // 開啟 Cas Client 注解 @SpringBootApplication public class StartMember8081 { private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login"; private static final String SERVER_NAME = "http://localhost:8081/"; @Bean public FilterRegistrationBean filterAuthenticationRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); // AuthenticationFilter 該過濾器負責用戶的認證工作 registration.setFilter(new AuthenticationFilter()); // 設定匹配的路徑 registration.addUrlPatterns("/*"); Map<String,String> initParameters = new HashMap<String, String>(); initParameters.put("casServerLoginUrl", CAS_SERVER_URL_LOGIN); initParameters.put("serverName", SERVER_NAME); // 忽略 /logoutSuccess 的路徑 initParameters.put("ignorePattern", "/logoutSuccess/*"); registration.setInitParameters(initParameters); // 設定加載的順序 registration.setOrder(1); return registration; } public static void main(String[] args) { SpringApplication.run(StartMember8081.class, args); } }
(2)客戶端 sp-order 模塊配置如下:
OrderController類:
package order.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @Controller public class OrderController { @RequestMapping("/test") @ResponseBody public String test() { return "order"; } /** * 退出 * @param request * @return */ @RequestMapping("/logout") public String logout(HttpServletRequest request) { HttpSession session = request.getSession(); session.invalidate(); return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8082/logoutSuccess"; } /** * 退出成功頁 * @return */ @RequestMapping("/logoutSuccess") @ResponseBody public String logoutSuccess() { return "order logoutSuccess"; } }
StartOrder8082類(啟動類):
package order; import net.unicon.cas.client.configuration.EnableCasClient; import org.jasig.cas.client.authentication.AuthenticationFilter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import java.util.HashMap; import java.util.Map; /** * 訂單服務啟動類 */ @EnableCasClient // 開啟 Cas Client 注解 @SpringBootApplication public class StartOrder8082 { private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login"; private static final String SERVER_NAME = "http://localhost:8082/"; @Bean public FilterRegistrationBean filterAuthenticationRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new AuthenticationFilter()); // 設定匹配的路徑 registration.addUrlPatterns("/*"); Map<String,String> initParameters = new HashMap<String, String>(); initParameters.put("casServerLoginUrl", CAS_SERVER_URL_LOGIN); initParameters.put("serverName", SERVER_NAME); // 忽略 /logoutSuccess 的路徑 initParameters.put("ignorePattern", "/logoutSuccess/*"); registration.setInitParameters(initParameters); // 設定加載的順序 registration.setOrder(1); System.out.println("init filter"); return registration; } public static void main(String[] args) { SpringApplication.run(StartOrder8082.class, args); } }
(3)測試訪問(會員業務) http://localhost:8081/test 是否會被攔截:
如上,會員服務接口已被成功攔截,地址重定向了 CAS Server 的登錄頁面。
(4)測試訪問(訂單服務) http://localhost:8082/test 是否會被攔截:
如上,訂單服務接口也成功被攔截。
(5)測試當一個客戶端登錄后,另外一個客戶端是否可以訪問:
如上,登錄后成功返回會員服務內容。
如上,刷新剛剛訂單服務請求地址,也成功返回訂單服務內容。
(6)測試當一個客戶端退出后,另外一個客戶端是否還可以訪問:
如上,先在瀏覽器訪問 http://localhost:8081/logout 接口,url 重定到 http://localhost:8081/logoutSuccess 接口,即表示會員服務已退出。
這時再刷新之前兩個服務的接口地址,均重定向到了 CAS Server 登錄頁,即實現了單點登出效果。
參考鏈接:https://www.jianshu.com/p/f2facc4d1c3a