<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    cas單點登錄配置速成


    服務(wù)端配置
    cas是個好東西,很靈活很好用,但是配置起來很麻煩,網(wǎng)上資料比較零碎。不弄個三五天根本不知道其中的原理,終于在多天的奮斗中配置成功,現(xiàn)在將配置的一些過程記錄下來供大家參考。


    cas官方網(wǎng)站

    http://www.jasig.org/cas

    下載最新的服務(wù)端 CAS Server 3.3.3 Final

    解壓后將modules下面的cas-server-webapp-3.3.3.war部署到web服務(wù)器,作為單點登錄的服務(wù)器。

     

    登錄的服務(wù)器下面很多配置文件,通過配置可以做一些擴展。

    修改點1:驗證方式使用我們自己的用戶表驗證

    cas和當(dāng)前已有的系統(tǒng)做集成的入口

    1.修改deployerConfigContext.xml文件

    添加數(shù)據(jù)源配置

    XML/HTML代碼

    <bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">   
         
    <property name="driverClassName">   
              
    <value>com.mysql.jdbc.Driver</value>   
         
    </property>   
         
    <property name="url">   
              
    <value>jdbc:mysql://192.168.1.100/ires?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true</value>   
         
    </property>   
         
    <property name="username">   
              
    <value>ires</value>   
         
    </property>   
         
    <property name="password">   
              
    <value>i709394</value>   
         
    </property>   
    </bean>   

    定義MD5的加密方式

    XML/HTML代碼


    <bean id="passwordEncoder"      
        class
    ="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">          
        
    <constructor-arg value="MD5"/>      
    </bean> 

    配置authenticationManager下面的authenticationHandlers屬性

    XML/HTML代碼


    <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">   
                          
    <property name="dataSource" ref="casDataSource" />   
                          
    <property name="sql" value="select community_password from community_user_info where lower(community_user_info.community_user) = lower(?)" />   
                            
    <property  name="passwordEncoder"  ref="passwordEncoder"/>   
    </bean>

    修改點2:獲取用戶信息保存,方便各個客戶端可以統(tǒng)一得到用戶信息

    1.定義attributeRepository,通過jdbc查詢用戶的詳細信息,可以把用戶表或用戶的所屬組織機構(gòu)或角色等查詢出來。

    XML/HTML代碼


    <bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">   
                        
    <constructor-arg index="0" ref="casDataSource" />   
                        
    <constructor-arg index="1" >   
                            
    <list>   
                                    
    <value>username</value>   
                                    
    <value>username</value>   
                            
    </list>   
                         
    </constructor-arg>   
                        
    <constructor-arg index="2">   
                            
    <value>   
                                select * ,(SELECT orgn_organization.id  from orgn_organization left join orgn_member on orgn_member.orgn_id = orgn_organization.id left join community_user_info on community_user_info.id = orgn_member.user_id where community_user_info.community_user = ?) as orgnId from community_user_info where community_user=?    
                            
    </value>   
                        
    </constructor-arg>   
                        
    <property name="columnsToAttributes">   
                            
    <map>   
                                
    <entry key="id" value="id" />   
                                
    <entry key="community_user" value="userName" />   
                                
    <entry key="orgnId" value="orgnId" />   
                                
    <entry key="is_admin" value="isAdmin" />   
                                    
                            
    </map>   
                        
    </property>   
                    
    </bean>   

    2.配置authenticationManager中credentialsToPrincipalResolvers屬性

    XML/HTML代碼


    <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver">   
                        
    <property name="attributeRepository" ref="attributeRepository" />   
    </bean>   

    注意:默認(rèn)cas登錄服務(wù)器沒有把用戶信息傳到客戶端中,所以要修改WEB-INF\view\jsp\protocol\2.0\casServiceValidationSuccess.jsp文件,增加

    XML/HTML代碼


    <c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">   
    <cas:attributes>   
    <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">   
                              
                                            
    <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>   
       
                               
    </c:forEach>     
    </cas:attributes>   
    </c:if>   

    修改點3:用數(shù)據(jù)庫來保存登錄的會話

    這樣服務(wù)器在重新啟動的時候不會丟失會話。

    1.修改ticketRegistry.xml文件

    將默認(rèn)的ticketRegistry改成

    XML/HTML代碼


    <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.JpaTicketRegistry">   
            
    <constructor-arg index="0" ref="entityManagerFactory" />   
        
    </bean>   
            
        
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">   
            
    <property name="dataSource" ref="dataSource"/>   
            
    <property name="jpaVendorAdapter">   
                
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">   
                    
    <property name="generateDdl" value="true"/>   
                    
    <property name="showSql" value="true" />   
                
    </bean>   
            
    </property>   
            
    <property name="jpaProperties">   
                
    <props>   
                    
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>   
                    
    <prop key="hibernate.hbm2ddl.auto">update</prop>   
                
    </props>   
            
    </property>   
        
    </bean>   
       
        
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"   
            p:entityManagerFactory-ref
    ="entityManagerFactory" />   
       
        
    <tx:annotation-driven transaction-manager="transactionManager"/>   
       
        
    <bean   
            
    id="dataSource"   
            class
    ="org.apache.commons.dbcp.BasicDataSource"   
            p:driverClassName
    ="com.mysql.jdbc.Driver"   
            p:url
    ="jdbc:mysql://192.168.1.100:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true"   
            p:password
    ="709394"   
            p:username
    ="itravel" />   

    配置完之后還需要一些jar的支持,根據(jù)提示那些包缺少到網(wǎng)上找。

     

    修改點4:配置remenber me的功能,可以讓客戶端永久保存session

    1.修改deployerConfigContext.xml文件

    authenticationManager增加authenticationMetaDataPopulators屬性

    XML/HTML代碼


    <property name="authenticationMetaDataPopulators">   
        
    <list>   
            
    <bean class="org.jasig.cas.authentication.principal.RememberMeAuthenticationMetaDataPopulator" />   
        
    </list>   
    </property>   

    2.修改cas-servlet.xml

    修改authenticationViaFormAction配置變成

    XML/HTML代碼

    <bean id="authenticationViaFormAction" class="org.jasig.cas.web.flow.AuthenticationViaFormAction"   
        p:centralAuthenticationService-ref
    ="centralAuthenticationService"   
        p:formObjectClass
    ="org.jasig.cas.authentication.principal.RememberMeUsernamePasswordCredentials"   
        p:formObjectName
    ="credentials"   
        p:validator-ref
    ="UsernamePasswordCredentialsValidator"   
        p:warnCookieGenerator-ref
    ="warnCookieGenerator" />   

    增加UsernamePasswordCredentialsValidator

    XML/HTML代碼

    <bean id="UsernamePasswordCredentialsValidator" class="org.jasig.cas.validation.UsernamePasswordCredentialsValidator" />   

    修改ticketExpirationPolicies.xml,grantingTicketExpirationPolicy配置如下,注意時間要加大,不然session很容易過期,達不到remember me的效果。

    XML/HTML代碼

    <bean id="grantingTicketExpirationPolicy" class="org.jasig.cas.ticket.support.RememberMeDelegatingExpirationPolicy">   
       
    <property name="sessionExpirationPolicy">   
        
    <bean class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">   
               
    <constructor-arg index="0" value="2592000000" />   
        
    </bean>   
       
    </property>   
       
    <property name="rememberMeExpirationPolicy">   
        
    <bean class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">   
               
    <constructor-arg index="0" value="2592000000" />   
        
    </bean>   
       
    </property>   
    </bean>   

    修改點5:取消https驗證

    在網(wǎng)絡(luò)安全性較好,對系統(tǒng)安全沒有那么高的情況下可以取消https驗證,使系統(tǒng)更加容易部署。

    1.修改ticketGrantingTicketCookieGenerator.xml

    XML/HTML代碼


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

    p:cookieSecure改成false,客戶端web.xml中單獨服務(wù)器的鏈接改成http

     

     

     

    使用https協(xié)議的配置

    1.證書生成和導(dǎo)入

    下面是一個生成證書和導(dǎo)入證書的bat腳本,如果web應(yīng)用和單獨登錄服務(wù)器部署在同一臺機可以一起執(zhí)行

    C++代碼


    @echo off    
    if "%JAVA_HOME%" == "" goto error    
    @echo on    
       
    @echo off    
    cls     
    rem please 
    set the env JAVA_HOME before run this bat file     
    rem delete alia tomcat 
    if it is existed     
    keytool 
    -delete -alias tomcatsso -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit     
    keytool 
    -delete -alias tomcatsso -storepass changeit     
    REM (注釋: 清除系統(tǒng)中可能存在的名字為tomcatsso 的同名證書)    
    rem list all alias 
    in the cacerts     
    keytool 
    -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit     
    REM (注釋: 列出系統(tǒng)證書倉庫中存在證書名稱列表)    
    rem generator a key     
    keytool 
    -genkey -keyalg RSA -alias tomcatsso -dname "cn=localhost" -storepass changeit     
    REM (注釋:指定使用RSA算法,生成別名為tomcatsso的證書,存貯口令為changeit,證書的DN為
    "cn=linly" ,這個DN必須同當(dāng)前主機完整名稱一致哦,切記!!!)    
    rem export the key     
    keytool 
    -export -alias tomcatsso -file "%java_home%/jre/lib/security/tomcatsso.crt" -storepass changeit     
    REM (注釋: 從keystore中導(dǎo)出別名為tomcatsso的證書,生成文件tomcatsso.crt)    
    rem import into trust cacerts     
    keytool 
    -import -alias tomcatsso -file "%java_home%/jre/lib/security/tomcatsso.crt" -keystore "%java_home%/jre/lib/security/cacerts" -storepass changeit     
    REM (注釋:將tomcatsso.crt導(dǎo)入jre的可信任證書倉庫。注意,安裝JDK是有兩個jre目錄,一個在jdk底下,一個是獨立的jre,這里的目錄必須同Tomcat使用的jre目錄一致,否則后面Tomcat的HTTPS通訊就找不到證書了)    
    rem list all alias 
    in the cacerts     
    keytool 
    -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit    
    pause    
       
    :error    
    echo 請先設(shè)置JAVA_HOME環(huán)境變量    
    :end   

    3.將.keystore文件拷貝到tomcat的conf目錄下面,注意.keystore會在證書生成的時候生成到系統(tǒng)的用戶文件夾中,如windows會生產(chǎn)到C:\Documents and Settings\[yourusername]\下面

    2.配置tomcat,把https協(xié)議的8443端口打開,指定證書的位置。

    XML/HTML代碼


    <Connector port="8443" maxHttpHeaderSize="8192"   
                  maxThreads
    ="150" minSpareThreads="25" maxSpareThreads="75"   
                  enableLookups
    ="false" disableUploadTimeout="true"   
                  acceptCount
    ="100" scheme="https" secure="true"   
                  clientAuth
    ="false" sslProtocol="TLS"     
      keystoreFile
    ="conf/.keystore"  keystorePass="changeit"   truststoreFile="C:\Program Files\Java\jdk1.5.0_07\jre\lib\security\cacerts"/>     

    客戶端配置

    cas官方網(wǎng)站上面的客戶端下載地址比較隱秘,沒有完全公開,具體地址為

    http://www.ja-sig.org/downloads/cas-clients/

    下載最新的cas-client-3.1.6-release.zip

    1.解壓后把modules下面的包放到我們的web應(yīng)用中

    2.配置web.xml,注意encodingFilter要提前配置,不然會出現(xiàn)數(shù)據(jù)插入數(shù)據(jù)庫的時候有亂碼。

    serverName是我們web應(yīng)用的地址和端口

    XML/HTML代碼


    <context-param>   
            
    <param-name>serverName</param-name>   
       
       
            
    <param-value>192.168.1.145:81</param-value>   
       
        
    </context-param>   
            
            
        
    <filter>   
            
    <filter-name>encodingFilter</filter-name>   
            
    <filter-class>   
                org.springframework.web.filter.CharacterEncodingFilter    
            
    </filter-class>   
            
    <init-param>   
                
    <param-name>encoding</param-name>   
                
    <param-value>UTF-8</param-value>   
            
    </init-param>   
            
    <init-param>   
                
    <param-name>forceEncoding</param-name>   
                
    <param-value>true</param-value>   
            
    </init-param>   
        
    </filter>   
            
            
            
        
    <filter-mapping>   
            
    <filter-name>encodingFilter</filter-name>   
            
    <url-pattern>*.htm</url-pattern>   
        
    </filter-mapping>   
       
        
    <filter-mapping>   
            
    <filter-name>encodingFilter</filter-name>   
            
    <url-pattern>*.ftl</url-pattern>   
        
    </filter-mapping>   
       
        
    <filter-mapping>   
            
    <filter-name>encodingFilter</filter-name>   
            
    <url-pattern>*.xhtml</url-pattern>   
        
    </filter-mapping>   
        
    <filter-mapping>   
            
    <filter-name>encodingFilter</filter-name>   
            
    <url-pattern>*.html</url-pattern>   
        
    </filter-mapping>   
        
    <filter-mapping>   
            
    <filter-name>encodingFilter</filter-name>   
            
    <url-pattern>*.shtml</url-pattern>   
        
    </filter-mapping>   
       
       
        
    <filter-mapping>   
            
    <filter-name>encodingFilter</filter-name>   
            
    <url-pattern>*.jsp</url-pattern>   
        
    </filter-mapping>   
        
    <filter-mapping>   
            
    <filter-name>encodingFilter</filter-name>   
            
    <url-pattern>*.do</url-pattern>   
        
    </filter-mapping>   
        
    <filter-mapping>   
            
    <filter-name>encodingFilter</filter-name>   
            
    <url-pattern>*.vm</url-pattern>   
        
    </filter-mapping>   
            
            
            
            
            
        
    <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>   
        
    <listener>   
            
    <listener-class>   
                org.jasig.cas.client.session.SingleSignOutHttpSessionListener    
            
    </listener-class>   
        
    </listener>   
        
    <filter>   
            
    <filter-name>CAS Authentication Filter</filter-name>   
            
    <filter-class>   
                org.jasig.cas.client.authentication.AuthenticationFilter    
            
    </filter-class>   
            
    <init-param>   
                
    <param-name>casServerLoginUrl</param-name>   
                
    <param-value>http://192.168.1.100/cas/login</param-value>   
            
    </init-param>   
        
    </filter>   
        
    <filter>   
            
    <filter-name>CAS Validation Filter</filter-name>   
            
    <filter-class>   
                org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter    
            
    </filter-class>   
            
    <init-param>   
                
    <param-name>casServerUrlPrefix</param-name>   
                
    <param-value>http://192.168.1.100/cas</param-value>   
            
    </init-param>   
        
    </filter>   
       
        
    <filter>   
            
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>   
            
    <filter-class>   
                org.jasig.cas.client.util.HttpServletRequestWrapperFilter    
            
    </filter-class>   
        
    </filter>   
        
    <filter>   
            
    <filter-name>CAS Assertion Thread Local Filter</filter-name>   
            
    <filter-class>   
                org.jasig.cas.client.util.AssertionThreadLocalFilter    
            
    </filter-class>   
        
    </filter>   
        
    <filter-mapping>   
            
    <filter-name>CAS Authentication Filter</filter-name>   
            
    <url-pattern>/*</url-pattern>   
        
    </filter-mapping>   
        
    <filter-mapping>   
            
    <filter-name>CAS Validation Filter</filter-name>   
            
    <url-pattern>/*</url-pattern>   
        
    </filter-mapping>   
        
    <filter-mapping>   
            
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>   
            
    <url-pattern>/*</url-pattern>   
        
    </filter-mapping>   
        
    <filter-mapping>   
            
    <filter-name>CAS Assertion Thread Local Filter</filter-name>   
            
    <url-pattern>/*</url-pattern>   
        
    </filter-mapping>   

    3.導(dǎo)入證書,如果不用https的話,這步可以跳過,把tomcatsso.crt證書拷貝到c盤下面,在jdk的bin目錄下面運行下面的語句。

     

    JavaScript代碼


    rem (注釋: 清除系統(tǒng)中可能存在的名字為tomcatsso 的同名證書)    
    keytool 
    -delete -alias tomcatsso -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit     
    keytool 
    -delete -alias tomcatsso -storepass changeit     
       
    rem 在客戶端的 JVM 里導(dǎo)入信任的 SERVER 的證書 ( 根據(jù)情況有可能需要管理員權(quán)限 )     
    keytool 
    -import -alias tomcatsso -file "c:/tomcatsso.crt" -keystore "%java_home%/jre/lib/security/cacerts" -storepass changeit    

     客戶端獲取登錄用戶名和用戶信息實例

    Java代碼

    HttpServletRequest request = ServletActionContext.getRequest();    
    AttributePrincipal principal 
    = (AttributePrincipal)request.getUserPrincipal();    
    String username 
    = principal.getName();    
    Long orgnId 
    = Long.parseLong(principal.getAttributes().get("orgnId").toString());   

    posted on 2009-10-20 23:58 paulwong 閱讀(4596) 評論(6)  編輯  收藏 所屬分類: J2EE

    Feedback

    # re: cas單點登錄配置速成 2009-10-22 16:23 849536401

    樓主寫的非常詳細,這是到現(xiàn)在為止我看到最全的cas配置文檔了。
    正需要這些信息呢,謝謝了!
    :)  回復(fù)  更多評論   

    # re: cas單點登錄配置速成 2009-10-30 15:00 游客

    學(xué)習(xí)  回復(fù)  更多評論   

    # re: cas單點登錄配置速成 2009-12-04 23:14 unique_zxs

    寫的非常棒,找了半個月你的是最詳細的。非常實用。  回復(fù)  更多評論   

    # re: cas單點登錄配置速成 2010-03-25 09:00 groush

    <c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
    <cas:attributes>
    <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">

    <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>


    </c:forEach>
    </cas:attributes>
    </c:if>
    這個文件拷進去,是錯的,但是我修改后,用戶信息也出不來,郁悶ing  回復(fù)  更多評論   

    # re: cas單點登錄配置速成 2010-05-12 15:33 郭凡

    到底怎么樣實現(xiàn)只登錄一次啊。。。還是沒看到具體的最后得到用戶信息這個東西有撒子用處?  回復(fù)  更多評論   

    # re: cas單點登錄配置速成 2010-05-12 15:41 郭凡

    哥哥,,522196314 能加我嗎。。。崇拜你  回復(fù)  更多評論   


    主站蜘蛛池模板: 我的小后妈韩剧在线看免费高清版| 久久亚洲色WWW成人欧美| 国产一二三四区乱码免费| 亚洲av无码国产精品色在线看不卡 | 亚洲区日韩区无码区| 亚洲欧美日韩自偷自拍| 1000部夫妻午夜免费| 久久亚洲国产精品五月天| a级毛片免费高清毛片视频| 亚洲AV日韩精品一区二区三区| 亚洲精品无码专区在线播放| 免费大片黄在线观看yw| 亚洲精品**中文毛片| 久久精品免费一区二区| 亚洲美女视频一区| 毛片免费全部播放无码| 久久久综合亚洲色一区二区三区 | 又粗又大又黑又长的免费视频| 香蕉视频在线观看亚洲| 国产成人久久AV免费| 亚洲国产精品一区二区久久| 免费成人在线电影| 久久久无码精品亚洲日韩蜜桃| 在线观看免费播放av片| 亚洲国产人成在线观看69网站 | 国产AV无码专区亚洲AV琪琪| 四虎永久成人免费| 伊人久久国产免费观看视频| 亚洲午夜激情视频| 国产在线精品免费aaa片| 亚洲神级电影国语版| 18国产精品白浆在线观看免费 | 亚洲一区精品无码| 永久在线观看免费视频| 亚洲精品自在线拍| 最近最新中文字幕完整版免费高清| 亚洲欧洲日韩极速播放| 亚洲国产精品综合久久网络| 亚洲aⅴ无码专区在线观看| 国产成人精品免费视频大| 91亚洲导航深夜福利|