(一) CAS单点登录 : 服务端搭建
1.下载
先在网上下载cas-server-3.5.2,将里面的cas-server-webapp-3.5.2.war放到tomcat的webapps目录下。
(现在源码被放到github,很难下载)
2.https设置
cas单点登默认使用的是https,所以需要证书,由于是个人测试和学习用的,可以用JDK自带的keytool工具生成证书。
2.1 用JDK生成证书:
命令:keytool -genkey -alias wsria -keyalg RSA -keystore d:/keys/wsriakey
其中-keystore 的参数是存放生成证书的路径,需要提前创建好keys文件夹,
您的名字与姓氏那一栏输入的是域名,而不能是ip。
这里可以修改hosts文件:C:\Windows\System32\drivers\etc\hosts
添加内容如下:
127.0.0.1 sso.wsria.com
这样在访问sso.wsria.com的时候其实是访问的127.0.0.1也就是本机
严重提醒:提示输入域名的时候不能输入IP地址
2.2 导出证书:
D:\keys>keytool -export -file d:/keys/wsria.crt -alias wsria -keystore d:/keys/wsriakey
特别提示:如果提示:
keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect
那么请输入密码:changeit
至此导出证书完成,可以分发给应用的JDK使用了,接下来讲解客户端的JVM怎么导入证书。
2.3 为客户端的JVM导入证书keytool -import -keystore D:\tools\jdk\1.6\jdk1.6.0_20\jre\lib\security\cacerts -file D:/keys/wsria.crt -alias wsria
D:\tools\jdk\1.6\jdk1.6.0_20\jre\lib\security -- 是jre的目录;密码还是刚刚输入的密码。至此证书的创建、导出、导入到客户端JVM都已完成,
下面开始使用证书到Web服务器中,本教程使用tomcat。
2.4 修改tomcat配置
打开tomcat的conf目录下server.xml,找到
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
将注释打开,并改为
<connector port="8443" protocol="HTTP/1.1" sslenabled="true" maxthreads="150" scheme="https" secure="true"
clientauth="false" sslprotocol="TLS" keystorefile="D:/keys/wsriakey" keystorepass="wsria.com">
</connector>
参数说明:
keystoreFile:在第一步创建的key存放位置
keystorePass:创建证书时的密码
3 启动tomcat进行测试
只要用户名密码一致就能登录。
4.取消https
如果不想用https的方式,需要修改一些配置。
4.1 找到WEB-INFO/deployerConfigContext.xml下
1 <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" 2 p:httpClient-ref="httpClient" />
添加参数requireSecure为false,如下:
1 <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" 2 p:httpClient-ref="httpClient" 3 p:requireSecure="false" />
4.2 找到WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml下
1 <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" 2 p:cookieSecure="true" 3 p:cookieMaxAge="-1" 4 p:cookieName="CASTGC" 5 p:cookiePath="/cas" />
将cookieSecure改为false,如下:
1 <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" 2 p:cookieSecure="false" 3 p:cookieMaxAge="-1" 4 p:cookieName="CASTGC" 5 p:cookiePath="/cas" />
4.3 找到WEB-INF\spring-configuration\warnCookieGenerator.xml下
1 <bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" 2 p:cookieSecure="true" 3 p:cookieMaxAge="-1" 4 p:cookieName="CASPRIVACY" 5 p:cookiePath="/cas" />
将cookieSecure改为false,如下
1 <bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" 2 p:cookieSecure="false" 3 p:cookieMaxAge="-1" 4 p:cookieName="CASPRIVACY" 5 p:cookiePath="/cas" />
4.4 找到tomcat的conf目录下server.xml
把之前打开的注释关闭。测试如下:
5.结尾
至此,一个简单的cas单点登录服务端就算搭建完成了
(二) CAS单点登录: 客户端配置
- 下载jar包
因为cas的源码修改变动很大,所以客户端引入的jar包根据服务端的war包而定。之前搭建的cas服务端用的版本是3.5.2,经过测试,可以使用cas-client-core的3.2.1版本。使用maven添加依赖
1 <!-- https://mvnrepository.com/artifact/org.jasig.cas.client/cas-client-core --> 2 <dependency> 3 <groupId>org.jasig.cas.client</groupId> 4 <artifactId>cas-client-core</artifactId> 5 <version>3.2.1</version> 6 </dependency>
不用maven的话可以用上面的地址去手动下载jar包。
- web.xml配置
引入jar包后,只要在客户端的web.xml里配置相应的过滤器即可。根据添加的过滤器的位置顺序一一介绍:
2.1 Cas20ProxyReceivingTicketValidationFilter(必需)
该过滤器负责对ticket的校验工作,这个过滤器要放在第一个位置。casServerUrlPrefix:cas服务器访问地址,serverName:客户端域名和端口。这里也可以配置成ip,但是最好还是配置成域名。
还有就是cas服务端我取消了https,这里路径注意一下。
1 <!-- 该过滤器配置负责对Ticket的校验工作--> 2 <filter> 3 <filter-name>CAS Validation Filter</filter-name> 4 <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> 5 <init-param> 6 <param-name>casServerUrlPrefix</param-name> 7 <param-value>http://www.mycas.com:8088/cas-server-webapp-3.5.2</param-value> 8 </init-param> 9 <init-param> 10 <param-name>serverName</param-name> 11 <param-value>http://127.0.0.1:80/</param-value> 12 </init-param> 13 <init-param> 14 <param-name>renew</param-name> 15 <param-value>false</param-value> 16 </init-param> 17 <init-param> 18 <param-name>gateway</param-name> 19 <param-value>false</param-value> 20 </init-param> 21 <init-param> 22 <param-name>encoding</param-name> 23 <param-value>UTF-8</param-value> 24 </init-param> 25 </filter> 26 <filter-mapping> 27 <filter-name>CAS Validation Filter</filter-name> 28 <url-pattern>/*</url-pattern> 29 </filter-mapping>
2.2 AuthenticationFilter(必需)
该过滤器负责用户的认证工作,casServerLoginUrl:cas服务端登录地址(注意这里比上面的多了'/login'),serverName:同上1 <!--该过滤器负责用户的认证工作--> 2 <filter> 3 <filter-name>CASFilter</filter-name> 4 <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> 5 <init-param> 6 <param-name>casServerLoginUrl</param-name> 7 <param-value>http://www.mycas.com:8088/cas-server-webapp-3.5.2/login</param-value> 8 </init-param> 9 <init-param> 10 <param-name>serverName</param-name> 11 <param-value>http://127.0.0.1:80/</param-value> 12 </init-param> 13 </filter> 14 <filter-mapping> 15 <filter-name>CASFilter</filter-name> 16 <url-pattern>/*</url-pattern> 17 </filter-mapping>
2.3 HttpServletRequestWrapperFilter (可选)与 AssertionThreadLocalFilter(可选)
1 <!--HttpServletRequestWrapperFilter--> 2 <filter> 3 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 4 <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> 5 </filter> 6 <filter-mapping> 7 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 8 <url-pattern>/*</url-pattern> 9 </filter-mapping> 10 11 <!--AssertionThreadLocalFilter--> 12 <filter> 13 <filter-name>CAS Assertion Thread Local Filter</filter-name> 14 <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> 15 </filter> 16 <filter-mapping> 17 <filter-name>CAS Assertion Thread Local Filter</filter-name> 18 <url-pattern>/*</url-pattern> 19 </filter-mapping>
这2个过滤器的功能是一样的,所以放到一起来讲,当我们登录成功后,需要获取登录的用户信息(只能获取到用户名),就需要配置上面2个过滤器的其中一个。获取方式如下:
客户端获取单点登录用户名:String ssoLoginName = getCasLoginName (); private String getCasLoginName () { //Map<String, Object> result = new HashMap<String, Object>(); AttributePrincipal principal = (AttributePrincipal) this.getRequest ().getUserPrincipal (); if (principal == null) { return null; } String userName = principal.getName(); try { //result = principal.getAttributes (); if (userName == null || userName == "") { return null; } } catch (Exception e) { e.printStackTrace(); } return userName; }
- 到这里客户端的配置就完成了~~
(三) CAS服务端配置读取数据库验证身份
1.在tomcat/webapps/cas/WEB-INF/lib,添加jar包
2.找到tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml,在此文件中找到
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
3.注释掉上面那句(这个Handler只是判断用户名和密码相同即可通过)
4.在后面加上:
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="dataSource" ref="dataSource"></property> <property name="sql" value="select password from u_user where useraccount=?"></property> <property name="passwordEncoder" ref="MD5PasswordEncoder"></property> </bean>
5.上面配置的说明:
QueryDatabaseAuthenticationHandler是cas-server-support-jdbc提供的查询接口其中一个是通过配置一个 SQL 语句查出密码,与所给密码匹配;
dataSource是使用JDBC查询时的数据源;
sql语句就是查询哪一张表,本例根据u_user表的useraccount字段查询密码,CAS会匹配用户输入的密码,如果匹配则通过;
passwordEncoder这个就算是自己加的盐巴了,意思很明显就是处理密码的加密,看你的应用中数据库保存的是明码还是加密过的,比如本例是使用MD5加密的,所以配置了MD5PasswordEncoder这个Handler,cas内置了MD5的功能所以只需要配置一下就可以了;如果在实际应用中使用的是公司自己的加密算法那么就需要自己写一个Handler来处理密码,实现方式也比较简单,创建一个类继承org.jasig.cas.authentication.handler.PasswordEncoder然后在encode方法中加密用户输入的密码然后返回即可。
6.在deployerConfigContext.xml文件末尾加入:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property> <property name="url"><value>jdbc:oracle:thin:@192.168.12.114:1521:ora11g</value></property> <property name="username"><value>uacs</value></property> <property name="password"><value>uacs</value></property> </bean> <bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"> <constructor-arg index="0"> <value>MD5</value> </constructor-arg> </bean>
7.修改上面的数据源即可配置完成