您好,登錄后才能下訂單哦!
這篇文章主要介紹springboot集成cas5.3如何實現sso單點登錄,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
單點登錄(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。
我們目前的系統存在諸多子系統,而這些子系統是分別部署在不同的服務器中,那么使用傳統方式的session是無法解決的,我們需要使用相關的單點登錄技術來解決。
SSO單點登錄訪問流程主要有以下步驟:
訪問服務:SSO客戶端發送請求訪問應用系統提供的服務資源。
定向認證:SSO客戶端會重定向用戶請求到SSO服務器。
用戶認證:用戶身份認證。
發放票據:SSO服務器會產生一個隨機的Service Ticket。
驗證票據:SSO服務器驗證票據Service Ticket的合法性,驗證通過后,允許客戶端訪問服務。
傳輸用戶信息:SSO服務器驗證票據通過后,傳輸用戶認證結果信息給客戶端。
cas服務端部署
地址:https://github.com/apereo/cas-overlay-template/tree/5.3
1、解壓下載的zip壓縮包
2、解壓后使用maven命令打包
mvn package
3、把target下生成的war包重命名為cas.war放到tomcat下
4、啟動tomcat
5、找到解壓的文件
由于cas默認使用的是基于https協議,需要改為兼容使用http協議,打開對應你的目錄文件:
D:\tomcat8\webapps\cas\WEB-INF\classes\application.properties
修改application.properties文件,添加下面配置,使用http
#使用http協議 cas.tgc.secure=false cas.serviceRegistry.initFromJson=true #由于https協議默認使用的端口為8443,還需我們修改為tomcat的8080端口 server.port=8080
修改HTTPSandIMAPS-10000001.json文件
D:\tomcat8\webapps\cas\WEB-INF\classes\services目錄下的HTTPSandIMAPS-10000001.json
把原來的serviceId內容改成如下
"serviceId" : "^(https|http|imaps)://.*",
兼容http修改完畢。
修改配置中的登錄用戶名密碼
cas.authn.accept.users=yyh::123456
cas服務器端搭建完畢,重啟tomcat 進行測試,在瀏覽器中輸入下面地址,進行訪問
http://localhost:8080/cas/login
服務端就已經搭好了,并且可以通過登錄退出了。
在新建的springboot項目的pom.xml添加如下依賴(匹配對應的版本)
<dependency> <groupId>net.unicon.cas</groupId> <artifactId>cas-client-autoconfig-support</artifactId> <version>2.3.0-GA</version> </dependency>
在resources下新建application.properties
server.port=8088 #cas服務端的地址 cas.server-url-prefix=http://localhost:8080/cas #cas服務端的登錄地址 cas.server-login-url=http://localhost:8080/cas/login #當前服務器的地址(客戶端) cas.client-host-url=http://localhost:8081 #Ticket校驗器使用Cas30ProxyReceivingTicketValidationFilter cas.validation-type=cas3
Application啟動類上添加注解
import net.unicon.cas.client.configuration.EnableCasClient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; //啟用cas @EnableCasClient @SpringBootApplication public class CasClient2Application { public static void main(String[] args) { SpringApplication.run(CasClient2Application.class, args); } }
第一個客戶端的controller
import org.jasig.cas.client.authentication.AttributePrincipal; import org.jasig.cas.client.validation.Assertion; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpSession; import static org.jasig.cas.client.util.AbstractCasFilter.CONST_CAS_ASSERTION; @RestController public class controller { @RequestMapping("/sso-test1") public String test1(HttpSession session){ Assertion assertion = (Assertion)session.getAttribute(CONST_CAS_ASSERTION); AttributePrincipal principal = assertion.getPrincipal(); String loginName = principal.getName(); return "sso-test1,當前登錄賬戶"+loginName; } }
一個客戶端就添加好了,添加另一個客戶端出端口其他基本也是一樣
第二個客戶端的controller
import org.jasig.cas.client.authentication.AttributePrincipal; import org.jasig.cas.client.validation.Assertion; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpSession; import static org.jasig.cas.client.util.AbstractCasFilter.CONST_CAS_ASSERTION; @RestController public class controller { @RequestMapping("/sso-test2") public String test1(HttpSession session){ Assertion assertion = (Assertion)session.getAttribute(CONST_CAS_ASSERTION); AttributePrincipal principal = assertion.getPrincipal(); String loginName = principal.getName(); return "sso-test222222,當前登錄賬戶"+loginName; } }
效果
在沒有登錄的情況下訪問 http://localhost:8081/sso-test1
直接跳到了登錄界面,并且把回調地址也帶上了
訪問第二個客戶端 http://localhost:8082/sso-test2
跟第一個也是一樣,這次我們隨便登錄一個
登錄后,執行了回調接口,刷新一下第一個客戶端的地址
也登錄成功了。
添加登出接口controller
/** * 退出 后自動重定向自定義接口 * @param request * @return */ @RequestMapping("/system/logout1") public String logout1(HttpServletRequest request) { HttpSession session = request.getSession(); session.invalidate(); return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8081/system/logoutSuccess"; } /** * 退出成功頁 * @return */ @RequestMapping("/system/logoutSuccess") @ResponseBody public String logoutSuccess() { return "test1成功退出!"; }
設置cas認證中心允許重定向跳轉
打開你的cas認證中心里的 application.properties 文件,添加如下配置
#退出登錄后允許跳轉 cas.logout.followServiceRedirects=true
新建config配置文件
import org.jasig.cas.client.authentication.AuthenticationFilter; import org.jasig.cas.client.session.SingleSignOutFilter; import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; import org.jasig.cas.client.util.HttpServletRequestWrapperFilter; import org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.EventListener; import java.util.HashMap; import java.util.Map; @Configuration public class config { //cas認證服務中心地址 private static final String CAS_SERVER_URL_PREFIX = "http://localhost:8080/cas/"; //cas認證服務中心 系統登錄地址 private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login"; //你自己的客戶端1的地址 private static final String SERVER_NAME = "http://localhost:8081/"; /** * description: 登錄過濾器 * @param: [] * @return: org.springframework.boot.web.servlet.FilterRegistrationBean */ @Bean public FilterRegistrationBean filterSingleRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new SingleSignOutFilter()); // 設定匹配的路徑 registration.addUrlPatterns("/*"); Map<String,String> initParameters = new HashMap<String, String>(); initParameters.put("casServerUrlPrefix", CAS_SERVER_URL_PREFIX); registration.setInitParameters(initParameters); // 設定加載的順序 registration.setOrder(1); return registration; } /** * description:過濾驗證器 * * @param: [] * @return: org.springframework.boot.web.servlet.FilterRegistrationBean */ @Bean public FilterRegistrationBean filterValidationRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new Cas30ProxyReceivingTicketValidationFilter()); // 設定匹配的路徑 registration.addUrlPatterns("/*"); Map<String,String> initParameters = new HashMap<String, String>(); initParameters.put("casServerUrlPrefix", CAS_SERVER_URL_PREFIX); initParameters.put("serverName", SERVER_NAME); initParameters.put("useSession", "true"); registration.setInitParameters(initParameters); // 設定加載的順序 registration.setOrder(1); return registration; } /** * description:授權過濾器 * @param: [] * @return: org.springframework.boot.web.servlet.FilterRegistrationBean */ @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); //設置忽略 退出登錄不用登錄 initParameters.put("ignorePattern", "/system/*"); registration.setInitParameters(initParameters); // 設定加載的順序 registration.setOrder(1); return registration; } /** * wraper過濾器 * @return */ @Bean public FilterRegistrationBean filterWrapperRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new HttpServletRequestWrapperFilter()); // 設定匹配的路徑 registration.addUrlPatterns("/*"); // 設定加載的順序 registration.setOrder(1); return registration; } /** * 添加監聽器 * @return */ @Bean public ServletListenerRegistrationBean<EventListener> singleSignOutListenerRegistration(){ ServletListenerRegistrationBean<EventListener> registrationBean = new ServletListenerRegistrationBean<EventListener>(); registrationBean.setListener(new SingleSignOutHttpSessionListener()); registrationBean.setOrder(1); return registrationBean; } }
客戶端2跟客戶端1的大似相同,這樣就可以實現登出一個系統,所有系統全部登出。
以上是“springboot集成cas5.3如何實現sso單點登錄”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。