1、服务端配置:java
证书web
进入cmd,不需更改cdspring
第一种方法:sql
一、用JDK自带的keytool生成证书数据库
keytool -genkey -alias sso -keyalg RSA -keystore e:/keys/ssokey apache
其中名字与姓氏写服务端域名,能够在C:\Windows\System32\drivers\etc\hosts文件中映射一个虚拟域名(127.0.0.1 sso),注意不要写IP。tomcat
二、导出证书安全
keytool -export -file e:/keys/ssokey.crt -alias sso -keystore e:/keys/ssokey服务器
三、把证书导入到客户端JDK中session
把服务端导出的证书发送给客户端,在客户端导入
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配置:
一、下载CAS的服务端,解压,把解压后的文件中modules文件夹中的cas-server-webapp-3.4.8.war文件拷贝的%TOMCAT_HOME%\webapps下,并修改文件名为:cas.war。
二、修改%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中设置的密码-->
三、以上配置完成访问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解密。
一、服务端加密:
找到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加密了
二、客户端解密:
在客户端配置处说明
服务端配置完成,访问https://sso:8443/cas,登录验证
2、客户端配置:
注意:若是在一台电脑上,不能使用同一个端口,本例客户端使用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服务器的验证地址
四、修改客户端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