您的位置:首页 > 运维架构 > Tomcat

cas+sso实现单点登录的步骤

2017-11-29 17:28 337 查看
刚接触这个东西,花了一天时间搞出这么一个demo,作为小新,我将步骤详细列出,希望对各位有所帮助

1.根据演示需求,用修改hosts 文件的方法添加域名最简单方便

(这个非常重要,因为CAS单点登录系统是基于JAVA安全证书的 https 访问, 要使用CAS单点登录必须要配置域名, cas是不能通过ip访问的.),

编辑文件 C:\Windows\System32\drivers\etc\hosts 在文件末端添加下面三条信息:

127.0.0.1 mycas.server.com

127.0.0.1 mycas.client1.com

127.0.0.1 mycas.client2.com

**********************************   服务端   *************************************************************************************************************

若不想配置证书等https的安全协议,而是用http,则只需要配置如下文件即可

CAS默认使用HTTPS协议,如果对安全要求不高,可使用HTTP协议。

修改为HTTP协议的步骤如下:

修改tomcat/webapps/cas/WEB-INF/deployerConfigContext.xml 增加参数p:requireSecure="false",意为:不需要安全验证。

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"p:httpClient-ref="httpClient"  

p:requireSecure="false"/>  

修改 ticketGrantingTicketCookieGenerator.xml (路径:cas/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml)中 

ticketGrantingTicketCookieGeneratorp:cookieSecure 属性的值改为 false。

<bean id="ticketGrantingTicketCookieGenerator"class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"  

p:cookieSecure="false"p:cookieMaxAge="-1" p:cookieName="CASTGC"p:cookiePath="/cas" />  

配置完成后直接完成下面第5步后完成服务端的部署

2.生成信任证书

tomcat自带的keytool生成信任证书

keytool -genkey -alias ssodemo -keyalg RSA -keysize 1024 -keypass 123456 -validity 365 -keystore f:\sso\ssodemo.keystore -storepass 123456

注意:这一步输入你的名字与姓氏时,将 mycas.server.com 输入,这里的 storepass 与keypass 必须一致,我在此设密码为123456

信任证书导出

keytool -export -alias ssodemo -keystore f:\sso\ssodemo.keystore -file f:\sso\ssodemo.crt -storepass 123456

信任证书导入到客户端

把%JAVA_HOME%/jre/lib/security/cacerts文件移出c盘(可以暂时放在桌面,我放在证书的目录里),否则无法访问 下面的命令执行完后再移进去

keytool -import -trustcacerts -alias tomcat -keystore f:\sso\cacerts -file f:\sso\ssodemo.crt -alias ssodemo

注意:若提示密码输入错误时,输入changeit

3.部署CAS-Server相关的Tomcat

  1.找到tomcat/conf/server.xml

  2.找到已被注释的下面代码(一般都是在83行)
<!--

    <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
-->

去掉注释,修改为以下代码

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

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

    keystoreFile="f:\sso\ssodemo.keystore" 
keystorePass="123456"

    clientAuth="false" sslProtocol="TLS" />

注意:keystoreFile 为生成信任证书时的文件路劲,keystorePass则是生成证书时的密码

4.测试tomcat配置是否成功(如果熟练有信心的大神则直接跳过此步) https://mycas.server.com:8443/
5.部署CAS-Server

  本文以cas-server-webapp-4.0.0.rar为例,解压提取cas-server-webapp-4.0.0.war文件,把改文件copy到E:\apache-tomcat-7.0.57\webapps 目下,并重命名为:cas.war。

启动tomcat,在浏览器地址栏输入:https://mycas.server.com:8443/cas ,回车,出现CAS服务端的登录验证首页:

6.配置cas的配置文件 (tomcat/webapps/cas/WEB-INF/deployerConfigContext.xml)

   (1)以下这段配置的是默认的账户名和密码 此处配置自己的mysql数据库,故这段代码注释掉
<bean id="primaryAuthenticationHandler" class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">

    <property name="users">

        <map>

            <entry key="casuser" value="Mellon"/>

        </map>

    </property>
</bean>

   (2)上面代码注释掉之后,在后面添加下面代码
<!-- 指定c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

    <property name="driverClass" value="com.mysql.jdbc.Driver" />

    <property ame="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/myProject?useUnicode=true&characterEncoding=UTF-8" />

    <property name="user" value="root" />

    <property name="password" value="root" />
</bean>

    
<!-- 访问本地数据库 -->
<bean id="dbAuthHandler"

      class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"

      p:dataSource-ref="dataSource"

      p:sql="SELECT u.`password` FROM `sec_user` u WHERE u.`account` = ?" />

   (3)找到下面这段配置
<constructor-arg>

  <map> 

    <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />

        <!-- 注释这个-->

        <!--<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />-->

    <!-- key-ref指定自己的本地数据库访问 -->

    <entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>

    </map>

  </constructor-arg>

注意,需要导入jar包:

c3p0-0.9.1.2.jar、cas-server-support-jdbc-4.0.0.jar、mysql-connector-java-5.1.13-bin.jar、mchange-commons-0.2

这3个缺一不可。将这3个jar放到E:\apache-tomcat-7.0.57\webapps\cas\WEB-INF\lib目录下。

-----------------------  上述服务端已经配置完成  ---------------------------------

************************************************************  客户端的配置  ***************************************************************************

1.导入jar包

   cas-client-core-3.2.1.jar,

   commons-logging-1.1.jar

  上述两个jar包在下载的cas-client的解压包里modules目录下有

2.修改tomcat服务的端口号

<Server port="8005" shutdown="SHUTDOWN">  

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

  connectionTimeout="20000"  

  redirectPort="8443" />  

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

参考修改如下

<Server port="18005" shutdown="SHUTDOWN">  

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

  connectionTimeout="20000"  

  redirectPort="18443" />  

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

3.在web.xml中配置如下

<!-----------------单点登录开始---------------------------->  

                <!--用于单点退出,该过滤器用于实现单点登出功能,可选配置-->  

                <listener>  

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

                </listener>  
<!--该过滤器用于实现单点登出功能,可选配置。 -->  

                <filter>  

                        <filter-name>CASSingle Sign Out Filter</filter-name>  

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

                </filter>  

                <filter-mapping>  

                        <filter-name>CASSingle Sign Out Filter</filter-name>  

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

                </filter-mapping>  
<filter>  

                        <filter-name>CASFilter</filter-name>  

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

                        <init-param>  

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

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

                        </init-param>  

                        <init-param>  

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

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

                        </init-param>  

                </filter>  

                <filter-mapping>  

                        <filter-name>CASFilter</filter-name>  

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

                </filter-mapping>  

                <!--该过滤器负责对Ticket的校验工作,必须启用它 -->  

                <filter>  

                        <filter-name>CASValidation Filter</filter-name>  

                        <filter-class>  

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

                        <init-param>  

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

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

                        </init-param>  

                        <init-param>  

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

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

                        </init-param>  

                </filter>  

                <filter-mapping>  

                        <filter-name>CASValidation Filter</filter-name>  

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

                </filter-mapping>  
<!--  

                        该过滤器负责实现HttpServletRequest请求的包裹,  

                        比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。  

                -->  

                <filter>  

                        <filter-name>CASHttpServletRequest Wrapper Filter</filter-name>  

                        <filter-class>  

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

                </filter>  

                <filter-mapping>  

                        <filter-name>CASHttpServletRequest Wrapper Filter</filter-name>  

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

                </filter-mapping>  
<!--  

                该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。  

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

                -->  

                <filter>  

                        <filter-name>CASAssertion Thread Local Filter</filter-name>  

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

                </filter>  

                <filter-mapping>  

                        <filter-name>CASAssertion Thread Local Filter</filter-name>  

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

                </filter-mapping>  
<!--------------------------------单点登录结束 ------------------------------->  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java cas sso tomcat 安全