1. 程式人生 > >cas實現單點登入-應用場景和完整配置

cas實現單點登入-應用場景和完整配置

Cas 簡介

1、什麼是CAS
CAS是一個單點登入(SSO)的框架。單點登入是目前比較流行的服務於企業業務整合的解決方案之一,SSO使得在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。
2、CAS的主要結構
CAS包括兩部分:CAS Server和CAS Client。
CAS Server負責完成對使用者的認證工作,需要獨立部署,CAS Server會處理使用者名稱/密碼等憑證(Credentials)。
CAS Client負責處理對客戶端受保護資源的訪問請求,需要對請求方進行身份認證時,重定向到CAS Server進行認證。CAS Client與受保護的客戶端應用部署在一起,以Filter方式保護受保護的資源。

應用場景說明

最近在開發過程中,多個系統共用一個認證資料庫,這就涉及到單點登入的問題。有三個系統A,B,C,登入時用的是同一套資料庫,三個系統間可以互相跳轉。目標是:三個系統中其中一個登入了,其他兩個就無需登入驗證。

cas實現單點登入完整配置

2、cas 服務端配置
cas服務端主要在實際應用中的配置有兩個:一是配置驗證資料庫,二是根據需要修改cas server登入預設頁面。

具體步驟如下:
1)、將Server端的war包放入Tomcat的webapps下,取名cas.war
2)、cas預設的驗證是使用者名稱和密碼相同即可,配置驗證的資料庫連線
A、開啟cas/WEB-INF/deployerConfigContext.xml
註釋掉預設驗證機制:

<!--<bean
    class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />-->

在下面新增新的驗證機制:

<bean id="dbAuthHandler" class = "org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
    <property name = "dataSource" ref="casDataSource"
/> <property name = "sql" value="select password from user where name = ?"/> </bean>

B、在beans下新增新的資料來源casDataSource:

<bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbcDriverClassName}" />
        <property name="url" value="${jdbcUrl}" />
        <property name="username" value="${jdbcUsername}" />
        <property name="password" value="${jdbcPassword}" />
        <property name="maxActive" value="${jdbcMaxActive}" />
        <property name="maxIdle" value="${jdbcMaxIdle}" />
        <property name="maxWait" value="${jdbcMaxWait}" />
        <property name="validationQuery" value="${jdbcValidationQuery}" />
    <property name="validationQueryTimeout" value="${jdbcValidationTimeOut}" /> 
        <property name="defaultAutoCommit" value="true" />
        <property name="testOnBorrow" value="true" />
</bean>

3)、在cas/WEB-INF/下新建jdbc.properties檔案,內容如下:

# JDBC Configuration
jdbcDriverClassName=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://10.172.110.226:3306/testdb?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
jdbcUsername=xhhtest
jdbcPassword=123456
# DBCP Pool Settings
jdbcInitialSize=5
jdbcMaxActive=10
jdbcMaxIdle=5
jdbcMaxWait=30000
jdbcValidationQuery=select 1 
jdbcValidationTimeOut=10

4)、修改cas/WEB-INF/spring-configuration/propertyFileConfigure.xml檔案

註釋:<!--  <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"     p:location="/WEB-INF/cas.properties" />-->
增加:
<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">    
        <property name="locations">
          <list>
            <value>/WEB-INF/cas.properties</value>
            <value>/WEB-INF/jdbc.properties</value>
          </list>
        </property>
</bean> 

5)、修改登入頁面
A、將提供的login資料夾複製到cas/下,login.jsp複製到cas/WEB-INF/view/jsp/default/ui
B、修改cas/WEB-INF/classes/default_views.properties

### Login view (/login) casLoginView.url=/WEB-INF/view/jsp/default/ui/casLoginView.jsp 改為:casLoginView.url=/WEB-INF/view/jsp/default/ui/login.jsp

6)、配置CAS伺服器儲存cookie時間
修改
cas/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml檔案:

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
        p:cookieSecure="false"
        p:cookieMaxAge="1800"
        p:cookieName="CASTGC"
        p:cookiePath="/cas" />

7)、登出功能重定向配置
修改cas/WEB-INF/cas-servlet.xml檔案中的:

<bean id="logoutController" class="org.jasig.cas.web.LogoutController"
    p:centralAuthenticationService-ref="centralAuthenticationService"
p:logoutView="casLogoutView"
    p:warnCookieGenerator-ref="warnCookieGenerator"
    p:followServiceRedirects="true" (增加此屬性)
    p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"

至此,cas server端配置完成,部署到容器tomcat中,即可訪問登入。

3、cas 客戶端配置
cas客戶段配置即實際應用程式,如系統A的配置。此配置主要涉及到的:jar包,過濾器以及登出功能。

具體步驟如下:
1)、修改pom檔案,加入需要的jar包依賴

<dependency>
            <groupId>org.jasig.cas.client</groupId>
            <artifactId>cas-client-core</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
<scope>runtime</scope>
            <version>3.0.1</version>
        </dependency>

2)、修改應用程式的web.xml檔案,進行過濾器配置
在應用程式的web.xml檔案中加入如下配置:

<filter>
     <filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter
</filter-class>
     <init-param>
       <param-name>casServerLoginUrl</param-name>
        <!-- cas server訪問路徑-->
<param-value>http://10.172.110.226:28080/cas/login</param-value>
     </init-param>
     <init-param>          
       <param-name>serverName</param-name>
        <!--應用程式訪問IP-->
       <param-value>http://10.172.110.225:8080/</param-value>
     </init-param>
   </filter>                  
   <filter-mapping>
     <filter-name>CASFilter</filter-name>
     <url-pattern>/*</url-pattern>
  </filter-mapping>

  <filter>
    <filter-name>CASValidationFilter</filter-name>   <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
  <!--cas server訪問地址-->
      <param-name>casServerUrlPrefix</param-name>
      <param-value> http://10.172.110.226:28080/cas/</param-value>
    </init-param>                        
<init-param>            
  <!—應用程式訪問IP-->
      <param-name>serverName</param-name>
      <param-value>http://10.172.110.225:8080/ </param-value>
    </init-param>                  
  </filter>                  
  <filter-mapping>
    <filter-name>CASValidationFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

3)編寫java類AuthenticationFilter,獲取登入使用者資訊

public class AuthenticationFilter implements Filter {

  public void destroy() {

  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
      throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    Object object = httpRequest.getSession().getAttribute("_const_cas_assertion_");
    if(object != null){
      Assertion assertion = (Assertion) object;
      String loginName = assertion.getPrincipal().getName();
      System.out.println("登入的使用者名稱:"+loginName);
      //可以根據使用者名稱操作相關邏輯,獲取User物件等
      //httpRequest.getSession().setAttribute("userName", loginName);
    }
    filterChain.doFilter(request, response);
  }

  public void init(FilterConfig arg0) throws ServletException {

  }
}

在web.xml中加入此過濾器:

   <filter>  
       <filter-name>AuthenticationFilter</filter-name> <filter-class>com.xhh.cas.filter.AuthenticationFilter
</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>AuthenticationFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
</filter-mapping>

4)、配置登出功能
A、在應用程式的web.xml檔案中加入如下配置:

<!--登出logout監聽器-->
<listener>
     <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!--登出logout 過濾器配置,注意此過濾器放於上述配置的filter之前!!-->
<filter>
     <filter-name>CAS Single Sign Out Filter</filter-name>
     <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CAS Single Sign Out Filter</filter-name>
     <url-pattern>/*</url-pattern>
</filter-mapping>

B、配置登出url, 如下:

<a href= "http://10.133.47.226:28080/bdocsso/logout?service=http://10.133.47.224:28080/bc-bdoc-sso">logout (退出)</a>
說明:http://10.172.110.226:28080/  為服務端地址
     http://10.172.110.225:28080/applicationA  為客戶端應   用程式訪問地址
     service="登出後跳轉的地址"