背景
有幾個相對獨立的java的web應用系統, 各自有本身的登錄驗證功能,用戶在使用不一樣的系統的時候,須要登錄不一樣的系統。如今須要提供一個統一的登錄/登出界面, 而不修改各個系統原來的登錄驗證機制。因而採用單點登陸系統CAS。
使用步驟
要使用單點登陸,須要部署CAS系統, CAS服務端能夠直接部署在tomcat下運行, 對於CAS服務端來講,全部要集成單點登陸的web應用都是它的一個客戶端, CAS有客戶端jar包, 客戶端web應用須要引入CAS客戶端的jar包,這樣CAS系統的服務端和客戶端web應用程序端才能通訊。
客戶端web應用程序的經過配置web.xml,添加CAS須要的各類過濾器,來實現和CAS服務器通訊, 用戶信息驗證工做在CAS服務端統一完成, 驗證經過後,客戶端web應用程序只須要補全本身的Session信息便可。
各個客戶端web應用程序須要使用一個公用的用戶表。
第一步 部署CAS系統服務端
1.從官網
http://www.jasig.org下載CAS Server, 將cas-server-webapp-3.4.12.war解壓, 能夠看到是一個標準的java的web應用, 能夠直接部署到tomcat的webapps目錄下的,我這裏假設部署的路徑是{tomcat_home}/webapps/cas。
2. CAS默認須要tomcat配置SSL協議,使用https協議通訊的。 因爲項目是企事業單位內部的系統,不須要這麼高的安全級別, 能夠簡化操做,不走SSL協議。修改下配置文件\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml, 以下, 將默認的true改爲false便可。
- <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
- p:cookieSecure="false"
- p:cookieMaxAge="-1"
- p:cookieName="CASTGC"
- p:cookiePath="/cas" />
3.配置登陸的驗證邏輯, 修改配置文件cas\WEB-INF\deployerConfigContext.xml。在authenticationHandlers中配置驗證方式,我這裏配置數據庫查詢語句來實現用戶名和密碼的驗證。
- <property name="authenticationHandlers">
- <list>
- <!--
- | This is the authentication handler that authenticates services by means of callback via SSL, thereby validating
- | a server side SSL certificate.
- +-->
- <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
- p:httpClient-ref="httpClient" />
- <!--
- | This is the authentication handler declaration that every CAS deployer will need to change before deploying CAS
- | into production. The default SimpleTestUsernamePasswordAuthenticationHandler authenticates UsernamePasswordCredentials
- | where the username equals the password. You will need to replace this with an AuthenticationHandler that implements your
- | local authentication strategy. You might accomplish this by coding a new such handler and declaring
- | edu.someschool.its.cas.MySpecialHandler here, or you might use one of the handlers provided in the adaptors modules.
- +-->
- <!-- <bean
- class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /> -->
- <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
- <property name="sql" value="select password from userTable where userName=?" />
- <property name="passwordEncoder" ref="passwordEncoder"/>
- <property name="dataSource" ref="dataSource" />
- </bean>
- </list>
- </property>
密碼加密方法我這裏使用MD5, 配置passwordEncoder的bean
- <bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
- <constructor-arg value="MD5"/>
- </bean>
在配置一個名稱爲dataSource的數據源
- <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
- <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property>
- <property name="driverUrl" value="jdbc:sqlserver://localhost:1433;databaseName=testDB;"></property>
- <property name="user" value="sa"></property>
- <property name="password" value="123456"></property>
- <property name="maximumConnectionCount" value="100"></property>
- <property name="minimumConnectionCount" value="1"></property>
- </bean>
數據源的配置根據本身的實際狀況來配置, 須要的jar若是lib下面沒有,本身複製進去, 否則數據源連不上報錯。
4. 如今服務端就配置好了, 若是須要定製登陸/登出頁面的話(實際項目基本上都須要修改), 修改cas\WEB-INF\view\jsp\default\ui\下面的casLoginView.jsp和casLogoutView.jsp就能夠了
第二步 客戶端web應用程序集成CAS
1. 從官網下載CAS Client, 將客戶端的jar,如cas-client-core-3.2.1.jar引入到web應用程序的classpath中
2 .配置web.xml文件, 主要是添加過濾器攔截通訊, 下面的實例代碼, 假設web應用程序的端口是8080
4. 注意上步配置文件中,過濾器CasForInvokeContextFilter的實現是須要在具體的應用中實現的,他的目的是, CAS服務端登陸驗證成功後,會將登陸用戶的用戶名攜帶回來, 這時客戶端web應用程序須要根據用戶名從數據庫用戶表中查詢到用戶的Id等信息, 並填充到Session中, 這樣,客戶端應用程序原來的驗證邏輯就不會出問題了, 由於咱們通常都是經過驗證session中是否含有當前登陸的用戶的ID來進行登陸驗證的。
下面是CasForInvokeContextFilter的一個簡單實現。
- public class CasForInvokeContextFilter implements Filter {
-
- @Override
- public void destroy() {
- }
-
- @Override
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- HttpSession session = ((HttpServletRequest) request).getSession();
-
- if (session.getAttribute("j_userId") == null) {
-
- Assertion assertion = AssertionHolder.getAssertion();
- String userName = assertion.getPrincipal().getName();
-
- try {
-
- User user = UserDao.getUserByName(userName);
- session.setAttribute("username", userName);
- session.setAttribute("userId", user.getId());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- chain.doFilter(request, response);
- }
-
- @Override
- public void init(FilterConfig config) throws ServletException {
- }
- }
到此,就完成了, 當你訪問具體應用的網址, 如http://具體應用IP: 8080/ ,就會跳轉到CAS服務器的登錄頁面: http://CAS服務器IP: 8080/ 進行登陸驗證, 驗證經過後, 又會跳轉回應用的網址。
第三步 單點登出
這個比較簡單, 只要在系統的登出事件中, 將URL訪問地址指向CAS服務登出的servlet, 就能夠了。
http://CAS服務器IP:8080/cas/logout