cas单点登录登出配置,学习记录

一、服务端配置:

证书

进入cmd,不需更改cd

第一种方法:

1、用JDK自带的keytool生成证书

keytool -genkey -alias  sso -keyalg RSA -keystore e:/keys/ssokey 

其中名字与姓氏写服务端域名,可以在C:\Windows\System32\drivers\etc\hosts文件中映射一个虚拟域名(127.0.0.1   sso),注意不要写IP。

2、导出证书

keytool -export -file e:/keys/ssokey.crt -alias sso -keystore e:/keys/ssokey

3、把证书导入到客户端JDK中

把服务端导出的证书发送给客户端,在客户端导入

keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file e:/keys/ssokey.crt -alias sso

或者

keytool-import -trustcacerts -alias server -file e:/keys/ssokey.crt -keystore e:/keys/cacerts,将会在该目录下产生一个cacerts文件,将这个文件,将这个文件拷贝覆盖到

客户端%JAVA_HOME%/jre/lib/security中。

 

服务端tomcat配置:

1、下载CAS的服务端,解压,把解压后的文件中modules文件夹中的cas-server-webapp-3.4.8.war文件拷贝的%TOMCAT_HOME%\webapps下,并修改文件名为:cas.war。

2、修改%TOMCAT_HOME%\conf\server.xml文件去掉此文件83到93行之间的注释,修改为:

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

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

               clientAuth="false" sslProtocol="TLS"   

               keystoreFile=" e:/keys/ssokey"  <!--在2.1中生成的证书的位置-->  

               keystorePass="123456"/>       <!--在2.1中设置的密码-->  

3、以上配置完成访问http://localhost:8443/cas

点击继续浏览会出现,登陆验证(此时用户名和密码相同即可)

 

读取数据库的信息进行身份验证:

在 modules 目录下可以找到包cas-server-support-jdbc-3.3.4.jar,再下载个ojdbc的jar包,将两个包拷贝到cas\WEB-INF\lib目录下

DataStore依赖于 spring.jar, commons-collections.jar,commons-dbcp.jar, commons-pool.jar

在apache和spring官方网找到这四个包把它们拷贝到cas\WEB-INF\lib下

 

打开tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml文件

注释掉92行:SimpleTestUsernamePasswordAuthenticationHandler这个验证Handler,这个是比较简单的,只是判断用户名和密码相同即可通过,这个肯定不能在实际应用中使用,弃用!

下面的代码替换:

<beanclass="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> 

                                   <propertyname="dataSource" ref="dataSource" /> 

                                   <propertyname="sql" value="select password from users whereusername=?" /> 

                                   <propertyname="passwordEncoder" ref="MD5PasswordEncoder"/>

                                   <!--<propertyname="passwordEncoder" ref="MyPasswordEncoder"/>-->

                            </bean>

在文件的末尾之前加入如下代码:

<bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">   

       <propertyname="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>   

       <propertyname="url"><value>jdbc:oracle:thin:@localhost :1521:orcl</value></property>   

       <propertyname="username"><value>hr</value></property>   

       <propertyname="password"><value>orcl</value></property>

</bean> 

 

<bean id="MD5PasswordEncoder"class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">

      <constructor-argindex="0">  

       <value>MD5</value> 

       </constructor-arg>

</bean>

 

密码加密问题:

使用md5加密(32位)——oracle数据库中要使用加密后的密码

也可以不加,只需将deployerConfigContext.xml中md5依赖取消,即下行代码删除   

<propertyname="passwordEncoder" ref="MD5PasswordEncoder"/>

 

解决中文乱码

直接利用spring的编码器进行utf-8编码,在web.xml中添加

<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> 

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

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

</filter-mapping>

需要注意的是,此配置需要在

 <filter-mapping>

<filter-name>CAS Client Info Logging Filter</filter-name>

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

</filter-mapping>的上方

 

中文用户名客户端乱码解决方案

因 为cas默认对中文是不支持的,在cas服务端与客户端之间,如果有中文存在,会有中文乱码的问题,虽然上文对请求进行了编码,但是客户端中文乱码的问题 始终存在。为了避免中文乱码的存在,临时解决方案是在服务器端对中文进行base64加密,在客户端进行base64解密。

1、服务端加密:

找到org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver类的源代码,这个类在cas-server-core-3.3.4.jar包中

找到 protectedString extractPrincipalId(final Credentials credentials)方法,将

returnusernamePasswordCredentials.getUsername();

改为return (newsun.misc.BASE64Encoder()).encode(usernamePasswordCredentials.getUsername().getBytes());

这样就可以在服务器端对所有用户名进行base64加密了

2、客户端解密:

在客户端配置处说明

 

服务端配置完成,访问https://sso:8443/cas,登陆验证

二、客户端配置:

注意:如果在一台电脑上,不能使用同一个端口,本例客户端使用8081端口

 

1、2.0x(是耶鲁的版本):

下载cas-client-2.0.11.zip解压

 

官方配置:

将cas-client-2.0.11\java\src源码或则lib \ jar包(casclient.jar,servlet.jar)导入到现有工程,在web.xml中添加官方文档配置,如下:

<filter>

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

              <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>

              <init-param>

                     <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>

                     <param-value>https://192.168.135.231:8443/cas/login</param- value><!--这里是cas服务器的地址,可以用ip,也可以用自定义地址,如本例的sso -->

              </init-param>

              <init-param>

                     <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>

                     <param-value>https://sso:8443/cas/serviceValidate</param-value><!--这里的是代理地址,为证书中的服务端域名-->

              </init-param>

              <init-param>

                     <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>

                     <param-value>localhost:8081</param-value><!--这里是cas客户端的地址,注意前边不加http://,因为跳转回来时已经有了-->

              </init-param>

       </filter>

 

       <filter-mapping>

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

              <!--对访问/servlet/HelloWorldExample 进行拦截,转向cas服务器端验证-->

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

       </filter-mapping>

 

自定义配置:

导入源码,修改edu.yale.its.tp.cas.client.filter.CASFilter类

1. 声明两个属性

private Stringcasclientport,casclientName,casserverport,casserverName;

2. 在init方法中添加

casclientport =config.getInitParameter("edu.yale.its.tp.cas.client.filter.port");

casclientName =config.getInitParameter("edu.yale.its.tp.cas.client.filter.serverName");

casserverport =config.getInitParameter("edu.yale.its.tp.cas.server.filter.port");

casserverName =config.getInitParameter("edu.yale.its.tp.cas.server.filter.serverName");

(获取xml中指定的地址和端口号)

3. 在doFilter方法中添加

casLogin="https://"+casserverName+":"+casserverport+"/cas/login";//cas服务器的登入地址

casServerName=casclientName+":"+casclientport;//这是cas客户端的地址,此处也可以使用casServerName = request.getServerName()+":"+casclientport;

casValidate="https://"+casserverName+":"+casserverport+"/cas/serviceValidate";//cas服务器的验证地址

4、修改客户端web.xml

<!-- CAS -->

<filter>

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

<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>

<init-param>

<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>

<param-value>/cas/login</param-value><!--默认无需修改 -->

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>

<param-value>/cas/serviceValidate</param-value><!--默认无需修改 -->

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.client.filter.port</param-name>

<param-value>8081</param-value><!--对应客户端端口号-->

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>

<param-value>localhost</param-value><!--这是服务器端验证后访问的地址-->

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.server.filter.port</param-name>

<param-value>8443</param-value><!--对应服务器端口号 因为是ssl安全连接,所以是8443-->

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.server.filter.serverName</param-name>

<param-value>sso</param-value><!--对应服务器域名-->

</init-param>

</filter>

<!-- 对访问/*的都进行拦截,并转向cas服务器,进行登入验证 -->

<filter-mapping>

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

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

</filter-mapping>

<!-- CAS end  -->

 

2.x版本暂时没有找到单点登出,借助3.x版本实现

下 载cas-client-3.1.12.zip并解压,在modules文件夹中有jar包(cas-client-core- 3.1.12.jar,commons-logging-1.1.jar),复制到应用的WEB-INF/lib目录中,或则复用源代码。客户端的 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>  <!--这里必须是/*,因为这里是由SSO服务器向每个客户端发送请求,这里负责拦截-->

       </filter-mapping>

 

客户端乱码解决:

因为我们上文对中文在服务器端进行了base64加密,在客户端,就需要进行解密

还是对CASFilter类进行修改

在读doFilter方法中找到以下语句

       if (session != null) // probably unncessary

           session.setAttribute(CAS_FILTER_USER, user);

将它修改为

     if (session != null) // probably unncessary

       {

           session.setAttribute(CAS_FILTER_USER, new String((new BASE64Decoder()).decodeBuffer(user)));

       }

这就是对base64加密的数据进行解密后再存放进客户端的session。

 

2、3.0x(jasig版本)

下载cas-client-3.1.12.zip并解压,在modules文件夹中有需要的jar包,请根据自己的项目情况选择使用,复制到应用的WEB-INF/lib目录中。客户端的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>  <!--这里必须是/*,因为这里是由SSO服务器向每个客户端发送请求,这里负责拦截-->

       </filter-mapping>

      

       <!--登录 -->

   <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>https://sso:8443/cas/login</param-value>  

     </init-param> 

     <init-param> 

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

       <param-value>localhost:8081</param-value> 

     </init-param> 

     <init-param> 

       <param-name>gateway</param-name> 

       <param-value>false </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>https://sso:8443/cas</param-value>  

     </init-param> 

     <init-param> 

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

       <param-value>localhost:8081</param-value> 

     </init-param> 

     <init-param> 

       <param-name>acceptAnyProxy</param-name> 

       <param-value>true </param-value> 

     </init-param> 

   </filter> 

   <filter> 

      <filter-name>CAS HttpServletRequest WrapperFilter</filter-name> 

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

   </filter> 

   <filter> 

     <filter-name>CAS Assertion Thread LocalFilter</filter-name> 

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

   </filter> 

 

       <filter-mapping>

              <filter-name>CASAuthentication Filter</filter-name>

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

       </filter-mapping>

       <filter-mapping>

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

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

       </filter-mapping>

       <filter-mapping>

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

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

       </filter-mapping>

       <filter-mapping>

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

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

       </filter-mapping>

 

这里可能出现org.apache.catalina.util.DefaultAnnotationProcessorcannot be cast to org….问题,修改了tomcat里的context.xml文件,在context 元素下添加: 

<Loader delegate="true" />

 

客户端配置完成,访问http://localhost:8081/xxxx ,验证

 

登录页面的扩展:

(1)   现在CAS系统中存在的两套登陆页面cas/webapp/WEB-INF/view/jsp/default/ui/和cas/webapp/WEB-INF/view/jsp/simple/ui

(2)   cas/webapp/WEB-INF/cas-servlet.xml

      <bean

              id="viewResolver"

              class="org.springframework.web.servlet.view.ResourceBundleViewResolver">

              <property

                     name="basename"

                     value="simple_views"/>

              <property

                     name="order"

                     value="0"/>

       </bean>

这个bean中basename属性决定由哪个属性文件加载,simple_views.properties还是default_views.Properties

而属性文件:

cas/webapp/WEB-INF/classes/default_views.properties

cas/webapp/WEB-INF/classes/simple_views.properties

 

### Login view (/login)

casLoginView.(class)=org.springframework.web.servlet.view.JstlView

casLoginView.url=/WEB-INF/view/jsp/default/ui/casLoginView.jsp

(登陆页面)

### Login confirmation view (logged in,warn=true)

casLoginConfirmView.(class)=org.springframework.web.servlet.view.JstlView

casLoginConfirmView.url=/WEB-INF/view/jsp/default/ui/casConfirmView.jsp

(当选择“警告”按钮时,系统显示的页面)

### Logged-in view (logged in, no serviceprovided)

casLoginGenericSuccessView.(class)=org.springframework.web.servlet.view.JstlView

casLoginGenericSuccessView.url=/WEB-INF/view/jsp/default/ui/casGenericSuccess.jsp(成功登陆页面)

每个属性文件决定具体加载页面的名称。

 

单点登出:

在客户端的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之前

界面的注销连接到CAS的logout地址,如https://sso:8443/cas/logout

 

cas单点退出回到指定的页面

退出的链接后加上?service=希望退出后返回的地址

例如  <ahref="https://sso:8443/cas/logout?service=http://localhost:8081/client1">退出</a>

 

本文所需资源下载地址:

cas-server-3.4.2.1-release.zip

http://download.csdn.net/detail/leilovegege/6800507

cas-client-3.1.12-release.zip

http://download.csdn.net/detail/leilovegege/6800481

cas-client-2.0.11.zip

http://download.csdn.net/detail/leilovegege/6800465

opensaml-1.1.jar

http://download.csdn.net/detail/leilovegege/6800361

tangosol.jar

http://download.csdn.net/detail/leilovegege/6800349

 

 


转载于:https://my.oschina.net/u/1433614/blog/189836

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值