CAS服務下單點登錄

jopen 11年前發布 | 72K 次閱讀 CAS OpenID/單點登錄SSO

此文的目的是為了加深自己的理解,做一個備份與分享

過程全為自己的實際操作步驟

第一步:準備的環境

win7 64位的系統

jdk1.6.0_37

apache-tomcat-6.0.14

cas-server-3.4.8-release

cas-client-3.2.0-release

這里用到的是tomcat自帶作為測試的程序


首先,找到系統的hosts文件( C:\Windows\System32\drivers\etc\hosts )增加


在本機映射三個域名

127.0.0.1   cas.baishi.com

127.0.0.1   app1.baishi.com

127.0.0.1   app2.baishi.com

解釋,其中,cas.baishi.com對應部署cas server的tomcat ,這個域名對應證書的生成

app1.baishi.com對應部署app1應用的tomcat

app2.baishi.com對應部署app2應用的tomcat

第二步:部署cas的服務

(1)首先,我在D盤下建一個文件夾,如D:/baishikeys 接著用jdk自帶的keytool生成證書,即在cmd命令中鍵入

keytool -genkey -alias baishi -keyalg RSA -keystore “D:/baishikeys/baishikey” 該命令生成keys證書

baishi為證書的別名,執行結果如下圖,注意其中姓氏要寫之前cas server對應的域名CAS服務下單點登錄
(2)導出證書

keytool -export -file d:/baishikeys/baishi.crt -alias baishi -keystore d:/baishikeys/baishikey

執行結果如圖(其中密碼和上面證書密碼一致)

CAS服務下單點登錄

(3)把證書導入JDK中

先找到你安裝的jdk目錄中cacerts文件刪掉,如D:\Program Files\Java\jdk1.6.0_37\jre\lib\security\cacerts

這樣的目的是避免后面報錯

執行keytool -import -keystore "D:\Program Files\Java\jdk1.6.0_37\jre\lib\security\cacerts" -file D:/baishikeys/baishi.crt -alias baishi

執行結果如圖(其中密碼和上面一致就行)CAS服務下單點登錄

第三步:配置cas的服務端

解壓apache-tomcat-6.0.14重命名為apache-tomcat-cas

把下載的cas-server-3.4.8-release包解壓,在文件modules中,找到cas-server-webapps-3.4.8.war

復制到apache-tomcat-caswebapps文件夾下,重命名為 cas.war,打開apache-tomcat-cas的

conf/server.xml文件,

找到6472中間的注釋打開,改為

 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

               maxThreads="150" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS" 

              keystoreFile="D:/baishikeys/baishikey"

              keystorePass="123456"

   />

其中keystoreFile是創建證書的路徑,keystorePass是創建證書的密碼,到此cas服務的配置完成

啟動cas服務的apache-tomcat-cas,訪問https://cas.baishi.com:8443/cas

執行圖:點擊繼續瀏覽此網站CAS服務下單點登錄

執行后圖

CAS服務下單點登錄

用戶名和密碼輸入相同的字符串就可以通過了

CAS服務下單點登錄

到此cas服務端的配置成功了

第四步:配置cas的客戶端

(1) 安裝配置 apache-tomcat-app1

解壓apache-tomcat-6.0.14 .tar,改名為apache-tomcat-app1對應應用app1的服務

修改apache-tomcat-app1的啟動端口,在文件conf/server.xml文件找到如下內容:

</tr> </tbody> </table> </div>

<Connector port="8080" protocol="HTTP/1.1"

</tr> </tbody> </table> </div>


               connectionTimeout="20000"

</tr> </tbody> </table> </div>


               redirectPort="8443" />

</tr> </tbody> </table> 改成


<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

</tr> </tbody> </table> </div>

<Connector port="18080" protocol="HTTP/1.1"

</tr> </tbody> </table> </div>


              connectionTimeout="20000"

</tr> </tbody> </table> </div>


              redirectPort="18443" />

</tr> </tbody> </table>
為了避免多個tomcat沖突,把<Server port="8005" shutdown="SHUTDOWN">也改成 <Server port="8085" shutdown="SHUTDOWN">

啟動apache-tomcat-app1</span> ,瀏覽器輸入 http://app 1 .baishi.com: 1 8080/examples/servlets/ 回車:

CAS服務下單點登錄

則tomcat配置成功

接下來復制 client的lib包cas-client-core-3.2.0.jarapache-tomcat-app1\webapps\examples\WEB-INF\lib\目錄下, 在apache-tomcat-app1\webapps\examples\WEB-INF\web.xml 文件中增加如下內容:

4 <Connector port="18009" protocol="AJP/1.3" redirectPort="18443" />

</tr> </tbody> </table> </div>

<!-- ======================== 單點登錄開始 ======================== -->

</tr> </tbody> </table> </div>


        <!-- 用于單點退出,該過濾器用于實現單點登出功能,可選配置-->

</tr> </tbody> </table> </div>


        <listener>


  •       

    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>

    </td> </tr> </tbody> </table>

    </tr> </tbody> </table> </div>


           </listener>

    </tr> </tbody> </table> </div>


     

    </tr> </tbody> </table> </div>


            <!-- 該過濾器用于實現單點登出功能,可選配置 -->

    </tr> </tbody> </table> </div>


            <filter>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Single Sign Out Filter</filter-name>

    </tr> </tbody> </table> </div>


                <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>

    </tr> </tbody> </table> </div>


            </filter>

    </tr> </tbody> </table> </div>


            <filter-mapping>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Single Sign Out Filter</filter-name>

    </tr> </tbody> </table> </div>


                <url-pattern>/*</url-pattern>

    </tr> </tbody> </table> </div>


            </filter-mapping>

    </tr> </tbody> </table> </div>


     

    </tr> </tbody> </table> </div>


            <filter>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Filter</filter-name>

    </tr> </tbody> </table> </div>


                <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>

    </tr> </tbody> </table> </div>


                <init-param>

    </tr> </tbody> </table> </div>


                    <param-name>casServerLoginUrl</param-name>

    </tr> </tbody> </table> </div>


                    <param-value>https://cas.baishi.com:8443/cas/login</param-value>

    </tr> </tbody> </table> </div>


                </init-param>

    </tr> </tbody> </table> </div>


                <init-param>

    </tr> </tbody> </table> </div>


                    <param-name>serverName</param-name>

    </tr> </tbody> </table> </div>


                    <param-value>http://app1.baishi.com:18080</param-value>

    </tr> </tbody> </table> </div>


               </init-param>

    </tr> </tbody> </table> </div>


            </filter>

    </tr> </tbody> </table> </div>


            <filter-mapping>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Filter</filter-name>

    </tr> </tbody> </table> </div>


                <url-pattern>/*</url-pattern>

    </tr> </tbody> </table> </div>


            </filter-mapping>

    </tr> </tbody> </table> </div>


            <!-- 該過濾器負責對Ticket的校驗工作,必須啟用它 -->

    </tr> </tbody> </table> </div>


            <filter>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Validation Filter</filter-name>

    </tr> </tbody> </table> </div>


                <filter-class>

    </tr> </tbody> </table> </div>


                    org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>

    </tr> </tbody> </table> </div>


                <init-param>

    </tr> </tbody> </table> </div>


                    <param-name>casServerUrlPrefix</param-name>

    </tr> </tbody> </table> </div>


                    <param-value>https://cas.baishi.com:8443/cas</param-value>

    </tr> </tbody> </table> </div>


                </init-param>

    </tr> </tbody> </table> </div>


               <init-param>

    </tr> </tbody> </table> </div>


                    <param-name>serverName</param-name>

    </tr> </tbody> </table> </div>


                    <param-value>http://app1.baishi.com:18080</param-value>

    </tr> </tbody> </table> </div>


               </init-param>

    </tr> </tbody> </table> </div>


            </filter>

    </tr> </tbody> </table> </div>


            <filter-mapping>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Validation Filter</filter-name>

    </tr> </tbody> </table> </div>


                <url-pattern>/*</url-pattern>

    </tr> </tbody> </table> </div>


            </filter-mapping>

    </tr> </tbody> </table> </div>


     

    </tr> </tbody> </table> </div>


            <!--

    </tr> </tbody> </table> </div>


                該過濾器負責實現HttpServletRequest請求的包裹,

    </tr> </tbody> </table> </div>


                比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登錄用戶的登錄名,可選配置。

    </tr> </tbody> </table> </div>


            -->

    </tr> </tbody> </table> </div>


            <filter>

    </tr> </tbody> </table> </div>


               <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>

    </tr> </tbody> </table> </div>


                <filter-class>

    </tr> </tbody> </table> </div>


                    org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>

    </tr> </tbody> </table> </div>


            </filter>

    </tr> </tbody> </table> </div>


            <filter-mapping>

    </tr> </tbody> </table> </div>


                <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>

    </tr> </tbody> </table> </div>


                <url-pattern>/*</url-pattern>

    </tr> </tbody> </table> </div>


            </filter-mapping>

    </tr> </tbody> </table> </div>


     

    </tr> </tbody> </table> </div>


        <!--

    </tr> </tbody> </table> </div>


            該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取用戶的登錄名。

    </tr> </tbody> </table> </div>


            比如AssertionHolder.getAssertion().getPrincipal().getName()。

    </tr> </tbody> </table> </div>


            -->

    </tr> </tbody> </table> </div>


            <filter>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Assertion Thread Local Filter</filter-name>

    </tr> </tbody> </table> </div>


                <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>

    </tr> </tbody> </table> </div>


            </filter>

    </tr> </tbody> </table> </div>


            <filter-mapping>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Assertion Thread Local Filter</filter-name>

    </tr> </tbody> </table> </div>


                <url-pattern>/*</url-pattern>

    </tr> </tbody> </table> </div>


            </filter-mapping>

    </tr> </tbody> </table> </div>


     

    </tr> </tbody> </table>

    (2) 安裝配置 apache-tomcat-app2

    解壓apache-tomcat-6.0.14 .tar,改名為apache-tomcat-app2對應應用app2的服務

    修改apache-tomcat-app2的啟動端口,在文件conf/server.xml文件找到如下內容:


            <!-- ======================== 單點登錄結束 ======================== -->

    </tr> </tbody> </table> </div>

    <Connector port="8080" protocol="HTTP/1.1"

    </tr> </tbody> </table> </div>


                   connectionTimeout="20000"

    </tr> </tbody> </table> </div>


                   redirectPort="8443" />

    </tr> </tbody> </table> 改成


    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    </tr> </tbody> </table> </div>

    <Connector port="28080" protocol="HTTP/1.1"

    </tr> </tbody> </table> </div>


                  connectionTimeout="20000"

    </tr> </tbody> </table> </div>


                  redirectPort="28443" />

    </tr> </tbody> </table>
    為了避免多個tomcat沖突,把<Server port="8005" shutdown="SHUTDOWN">也改成<Server port="8095" shutdown="SHUTDOWN">

    啟動apache-tomcat-app2,瀏覽器輸入 http://app2.baishi.com:28080/examples/servlets/ 回車:

    按照上述(1)中的方法驗證是否成功。


    接下來復制 client的lib包cas-client-core-3.2.0.jar到 apache-tomcat-app2\webapps\examples\WEB-INF\lib\目錄下, 在apache-tomcat-app2\webapps\examples\WEB-INF\web.xml 文件中增加如下內容:

    4 <Connector port="28009" protocol="AJP/1.3" redirectPort="28443" />

    </tr> </tbody> </table> </div>

    <!-- ======================== 單點登錄開始 ======================== -->

    </tr> </tbody> </table> </div>


            <!-- 用于單點退出,該過濾器用于實現單點登出功能,可選配置-->

    </tr> </tbody> </table> </div>


            <listener>


          

    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>

    </td> </tr> </tbody> </table>

    </tr> </tbody> </table> </div>


           </listener>

    </tr> </tbody> </table> </div>


     

    </tr> </tbody> </table> </div>


            <!-- 該過濾器用于實現單點登出功能,可選配置 -->

    </tr> </tbody> </table> </div>


            <filter>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Single Sign Out Filter</filter-name>

    </tr> </tbody> </table> </div>


                <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>

    </tr> </tbody> </table> </div>


            </filter>

    </tr> </tbody> </table> </div>


            <filter-mapping>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Single Sign Out Filter</filter-name>

    </tr> </tbody> </table> </div>


                <url-pattern>/*</url-pattern>

    </tr> </tbody> </table> </div>


            </filter-mapping>

    </tr> </tbody> </table> </div>


     

    </tr> </tbody> </table> </div>


            <filter>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Filter</filter-name>

    </tr> </tbody> </table> </div>


                <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>

    </tr> </tbody> </table> </div>


                <init-param>

    </tr> </tbody> </table> </div>


                    <param-name>casServerLoginUrl</param-name>

    </tr> </tbody> </table> </div>


                    <param-value>https://cas.baishi.com:8443/cas/login</param-value>

    </tr> </tbody> </table> </div>


                </init-param>

    </tr> </tbody> </table> </div>


                <init-param>

    </tr> </tbody> </table> </div>


                    <param-name>serverName</param-name>

    </tr> </tbody> </table> </div>


                    <param-value>http://app2.baishi.com:18080</param-value>

    </tr> </tbody> </table> </div>


               </init-param>

    </tr> </tbody> </table> </div>


            </filter>

    </tr> </tbody> </table> </div>


            <filter-mapping>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Filter</filter-name>

    </tr> </tbody> </table> </div>


                <url-pattern>/*</url-pattern>

    </tr> </tbody> </table> </div>


            </filter-mapping>

    </tr> </tbody> </table> </div>


            <!-- 該過濾器負責對Ticket的校驗工作,必須啟用它 -->

    </tr> </tbody> </table> </div>


            <filter>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Validation Filter</filter-name>

    </tr> </tbody> </table> </div>


                <filter-class>

    </tr> </tbody> </table> </div>


                    org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>

    </tr> </tbody> </table> </div>


                <init-param>

    </tr> </tbody> </table> </div>


                    <param-name>casServerUrlPrefix</param-name>

    </tr> </tbody> </table> </div>


                    <param-value>https://cas.baishi.com:8443/cas</param-value>

    </tr> </tbody> </table> </div>


                </init-param>

    </tr> </tbody> </table> </div>


               <init-param>

    </tr> </tbody> </table> </div>


                    <param-name>serverName</param-name>

    </tr> </tbody> </table> </div>


                    <param-value>http://app2.baishi.com:18080</param-value>

    </tr> </tbody> </table> </div>


               </init-param>

    </tr> </tbody> </table> </div>


            </filter>

    </tr> </tbody> </table> </div>


            <filter-mapping>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Validation Filter</filter-name>

    </tr> </tbody> </table> </div>


                <url-pattern>/*</url-pattern>

    </tr> </tbody> </table> </div>


            </filter-mapping>

    </tr> </tbody> </table> </div>


     

    </tr> </tbody> </table> </div>


            <!--

    </tr> </tbody> </table> </div>


                該過濾器負責實現HttpServletRequest請求的包裹,

    </tr> </tbody> </table> </div>


                比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登錄用戶的登錄名,可選配置。

    </tr> </tbody> </table> </div>


            -->

    </tr> </tbody> </table> </div>


            <filter>

    </tr> </tbody> </table> </div>


               <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>

    </tr> </tbody> </table> </div>


                <filter-class>

    </tr> </tbody> </table> </div>


                    org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>

    </tr> </tbody> </table> </div>


            </filter>

    </tr> </tbody> </table> </div>


            <filter-mapping>

    </tr> </tbody> </table> </div>


                <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>

    </tr> </tbody> </table> </div>


                <url-pattern>/*</url-pattern>

    </tr> </tbody> </table> </div>


            </filter-mapping>

    </tr> </tbody> </table> </div>


     

    </tr> </tbody> </table> </div>


        <!--

    </tr> </tbody> </table> </div>


            該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取用戶的登錄名。

    </tr> </tbody> </table> </div>


            比如AssertionHolder.getAssertion().getPrincipal().getName()。

    </tr> </tbody> </table> </div>


            -->

    </tr> </tbody> </table> </div>


            <filter>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Assertion Thread Local Filter</filter-name>

    </tr> </tbody> </table> </div>


                <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>

    </tr> </tbody> </table> </div>


            </filter>

    </tr> </tbody> </table> </div>


            <filter-mapping>

    </tr> </tbody> </table> </div>


                <filter-name>CAS Assertion Thread Local Filter</filter-name>

    </tr> </tbody> </table> </div>


                <url-pattern>/*</url-pattern>

    </tr> </tbody> </table> </div>


            </filter-mapping>

    </tr> </tbody> </table> </div>


     

    </tr> </tbody> </table> </div>

    第五步:測試

    啟動之前配置好的三個tomcat分別為:apache-tomcat-casapache-tomcat-app1apache-tomcat-app2.

    打開瀏覽器地址欄中輸入:http://app1.baishi.com:18080/examples/servlets/servlet/HelloWorldExample

    輸入賬戶和密碼之后會出現Hello World

    之瀏覽器地址中輸入http://app2.baishi.com:28080/examples/servlets/servlet/HelloWorldExample

    就不用輸入賬戶和密碼了,直接進入Hello World

    最后地址欄中輸入:https://cas.baishi.com:8443/cas/logout會注銷這個流程,重新開始認證

    以上就是整個cas單點登錄的簡單配置


    如果有cas服務的tomcat報錯java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR

    只需把

     <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

                   maxThreads="150" scheme="https" secure="true"

                   clientAuth="false" sslProtocol="TLS" 

                  keystoreFile="D:/baishikeys/baishikey"

                  keystorePass="123456"

       />

    改成

     <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"

                   maxThreads="150" scheme="https" secure="true"

                   clientAuth="false" sslProtocol="TLS" 

                  keystoreFile="D:/baishikeys/baishikey"

                  keystorePass="123456"

       />

    即可

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!

            <!-- ======================== 單點登錄結束 ======================== -->
  • sesese色