前兩篇介紹了Apereo CAS以及服務器端的安裝,但還不夠完整,服務端尚未Application真正用起來呢!這篇文章將介紹怎麼用起來
客戶端咱們想要與Apereo CAS作什麼集成呢?回顧一下Apereo CAS是作什麼的?Apereo CAS的一個功能就是單點登陸,統一的登陸登出接口與頁面,讓系統中的模塊只須要關注在業務點,而把安全認證的功能交給統一認證來作。因此客戶端的集成主要是單點登陸的集成,客戶端指定須要作安全認證的頁面,而後Apereo CAS的安全包檢測校驗用戶登陸狀況,並自動與CAS登陸頁面進行跳轉交互。java
Apereo CAS提供了Springboot的包,可讓咱們的集成些微方便了那麼一丟丟!首先咱們建立一個Springboot的application,裏面帶了Apereo CAS start的依賴spring
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-cas</artifactId> </dependency>
同時在application.properties文件裏面指定啓動的端口 server.port = 9000
json
有了Apereo CAS的包以後,咱們就能夠進行代碼的配置。客戶端的配置按照SpringSecurity的安全檢驗流程進行的:安全
AuthenticationEntryPoint
被觸發了,把用戶重定向到配置好的CAS登陸頁面https://localhost:6443/casCasAuthenticationFilter
一直在監聽/login/cas
這個路徑,當發現有請求後,它會觸發CasTicketValidator,由CasTickerValidator檢驗ticket的有效性下面代碼大體描述了這個過程:服務器
@Bean public ServiceProperties serviceProperties() { ServiceProperties serviceProperties = new ServiceProperties(); serviceProperties.setService("http://localhost:9000/login/cas"); serviceProperties.setSendRenew(false); return serviceProperties; } @Bean @Primary public AuthenticationEntryPoint authenticationEntryPoint( ServiceProperties sP) { CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint(); entryPoint.setLoginUrl("https://localhost:6443/cas/login"); entryPoint.setServiceProperties(sP); return entryPoint; } @Bean public TicketValidator ticketValidator() { return new Cas30ServiceTicketValidator( "https://localhost:6443/cas"); } @Bean public CasAuthenticationProvider casAuthenticationProvider() { CasAuthenticationProvider provider = new CasAuthenticationProvider(); provider.setServiceProperties(serviceProperties()); provider.setTicketValidator(ticketValidator()); provider.setUserDetailsService( s -> new User("casuser", "Mellon", true, true, true, true, AuthorityUtils.createAuthorityList("ROLE_ADMIN"))); provider.setKey("CAS_PROVIDER_LOCALHOST_9000"); return provider; }
@EnableWebSecurity @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { private AuthenticationProvider authenticationProvider; private AuthenticationEntryPoint authenticationEntryPoint; private SingleSignOutFilter singleSignOutFilter; private LogoutFilter logoutFilter; @Autowired public SecurityConfig(CasAuthenticationProvider casAuthenticationProvider, AuthenticationEntryPoint eP, LogoutFilter lF , SingleSignOutFilter ssF ) { this.authenticationProvider = casAuthenticationProvider; this.authenticationEntryPoint = eP; this.logoutFilter = lF; this.singleSignOutFilter = ssF; } // ... @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(authenticationProvider); } @Override protected AuthenticationManager authenticationManager() throws Exception { return new ProviderManager(Arrays.asList(authenticationProvider)); } @Bean public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties sP) throws Exception { CasAuthenticationFilter filter = new CasAuthenticationFilter(); filter.setServiceProperties(sP); filter.setAuthenticationManager(authenticationManager()); return filter; } }
下面這個文件配置了application中全部/secured/*
,login
的URL都是受保護資源,都要通過CAS認證過才能夠訪問:app
@EnableWebSecurity @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .regexMatchers("/secured.*", "/login") .authenticated() .and() .authorizeRequests() .regexMatchers("/") .permitAll() .and() .httpBasic() .authenticationEntryPoint(authenticationEntryPoint); } // ... }
跟全部統一認證平臺同樣,全部application想要跟CAS作集成的,都須要在CAS配置相應的參數纔可使用。Apereo CAS提供了不少配置的方式,有YML,JSON, MongoDB以及其餘(可查官網)。但高度自由的CAS一如既往的,沒有提供可視化操做的界面。好比咱們採用JSON的方式。首先咱們須要通知Apereo CAS咱們採用的是JSON的方式,並通知JSON文件的路徑在哪裏框架
cas.serviceRegistry.initFromJson=true cas.serviceRegistry.config.location=classpath:/services
而後咱們在這個目錄裏面,建立一個對應的JSON文件,保存咱們的客戶端信息,爲了方面管理,建議文件名爲 application_id.json, 好比"secureApp_9991.json", 內容以下:ide
{ "@class" : "org.apereo.cas.services.RegexRegisteredService", "serviceId" : "^http://localhost:9000/login/cas", "name" : "CAS Spring Secured App", "description": "This is a Spring App that usses the CAS Server for it's authentication", "id" : 19991, "evaluationOrder" : 1 }
第一次配置從JSON加載客戶端配置的話,須要重啓Apereo CAS。以後再加新的客戶端的話就不用再重啓,Apereo CAS會自動監測這個文件夾的變更學習
至此咱們對於Apereo CAS就有了一個稍微完整一點點的瞭解,從服務端安裝部署,到配置,以及客戶端如何集成等。但從這個短期的學習來看,若是企業已經重度使用了Apereo CAS,那相信它能夠很好地服務支撐企業的應用。但若是是新的項目,特別是項目週期比較緊張的項目,而且團隊以前沒有對統一認證有技術積累的話,不是很建議採用Apereo CAS,這些細微的配置以及無所不在的隱藏功能,會讓你給項目經理催死的! 後面我會介紹另一個統一認證的框架,我的感受能彌補Apereo CAS的短板的ui