公司有几个系统想做SSO,然后开始研究cas。系统是Centos7
搭建CAS服务器#
cas的版本比较多,先在网上搜了一下各种教程配置经验。本来想搭建最新的CAS版本,然而为了快速部署,选择了网上教程比较详细的cas-4.0.0版本。
-
安装包和环境依赖
cas-server是依赖jdk,tomcat,spring等,jdk和tomcat装最新版本就可以了,cas-server这里选了4.0.0.因为版本不同配置还有是区别的,所以这里强调一下版本。因为没玩过JAVA,spring framework我没装,可能是tomcat自带的。。新版本的cas-server好像是通过maven来装,具体怎么装我不知道。。但是有点想研究,看以后会不会填坑。
1.1 jdk
yum install 安装貌似默认是1.7,然后我选了1.8
1.2 tomcat
yum install 安装最新版
1.3 spring framework
我没装。。然后没啥影响。。
1.3 cas-server-4.0.0
在cas官网下载的,速度超级慢。不知道有没有镜像。下载完成然后解压。进入文件夹 找到cas-server-4.0.0/modules/cas-server-webapp-4.0.0.war
这个 war 文件,拷贝到tomcat的webapps目录下。默认目录在/usr/local/tomcat/webapps/
。以前没玩过JAVA不知道,原来war
文件拷贝过来就会马上自动解压成文件夹,然后war
移动或删除那个同名文件压也会被删!modules 目录下的其他jar
是可能需要的依赖包,放到webapps下面自动生成的文件夹里的WEB-INF/lib/
下,比如我这里叫cas-server-webapp-4.0.0/WEB-INF/lib/
。然后启动tomcat,在浏览器打开。
tomcat的启动和关闭在tomcat目录下的bin/
目录的shutdown.sh
和startup.sh
:
(吐槽下tomcat的重启慢到令人发指,推荐一个解决办法) -
导入证书OR去除https限制
2.1 生成ssl证书
cas默认使用https,需要ssl证书。我跟着步骤生成了一个crt证书,然后就不知道干嘛了。所以还是老老实实用http跑通再说。
2.2 去除https限制
主要有3个地方需要修改:
2.21WEB-INF/deployerConfigContext.xml
找到proxyAuthenticationHandle
添加属性p:requireSecure="false"
.
<bean id="proxyAuthenticationHandler"
class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient"
p:requireSecure="false" />
2.22 `WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml` 将 `p:cookieSecure="true"` 改为 `p:cookieSecure="false"`
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />
2.23 `WEB-INF/spring-configuration/warnCookieGenerator.xml` 将 `p:cookieSecure="true"` 改为 `p:cookieSecure="false"`。 同上
- 验证方式
比较好奇应该90%都会使用数据库的用户和密码进行认证吧,为啥cas的默认认证方式不设置成数据库方式呢。难道是为了给用户自己选择数据库的自由?这里主要是3个XML属性配置
3.0 依赖包
+.mysql-connector-java-5.1.42.jar
跟版本关系不大
+.c3p0-0.9.1.2.jar
这个很关键
+.cas-server-support-jdbc-4.0.0.jar
注意跟cas-server版本一致
3.1 数据源(数据库配置)
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="${database.driverClass}"
p:jdbcUrl="${database.url}"
p:user="${database.user}"
p:password="${database.password}" />
网上配置教程大都是直接把配置写到这里,我这里建议用官方文档的变量方式,一来避免`jdbcUrl`的特殊字符编码问题,而来方便修改配置。这些变量都可以在同目录下的 `cas.properties`中配置
# == Basic database connection pool configuration ==
database.driverClass=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/cas_test?useUnicode=true&characterEncoding=UTF8
database.user=root
database.password=root
3.2 加密算法
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
c:encodingAlgorithm="SHA1"
p:characterEncoding="UTF-8" />
系统自带MD5和SHA1加密算法,可以自定义,然而因为我没搞过JAVA所以就停留在这一步,没有深入研究。
3.3 认证方式
<bean id="dbAuthHandler"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource"
p:passwordEncoder-ref="passwordEncoder"
p:sql="SELECT `password` FROM `cas_user` WHERE `username`=?" />
可以看出上面2个配置项都是给这个做铺垫。这个SQL语句根据自己的数据库进行查询。网上教程有提到还有一个地方要修改
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<!-- <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" /> -->
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" />
个人理解这里不一定要改成这样,如果保留原来的`primaryAuthenticationHandler`那么需要把原来的`<bean id="primaryAuthenticationHandler"...`给注释掉。而另指定一个认证器`dbAuthHandler`就可以不用注释掉原来的。到这里配置完成。
我在这里配置了无数遍,然后各种错误。而且我又不知道怎么查看java/tomcat错误,最后莫名其妙成功了。总结一下可能出错的地方:
dataSource 中的 class , 网上有的给出来的不一样,建议以官网为主
jdbcUrl 可能有特殊字符编码问题,建议写到 cas.properties
依赖包不对
- 返回用户信息
4.1 从数据库查询更多信息
<!-- 查询更多用户字段 -->
<bean class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao" id="attributeRepository">
<constructor-arg index="0" ref="dataSource"/>
<!-- 这里配置查询语句, {0},{1}对应接下来的`queryAttributeMapping`的map索引 -->
<constructor-arg index="1" value="select * from cas_user where {0}"/>
<property name="queryAttributeMapping">
<map>
<!--这里的key需写username和登录页面一致,value对应数据库用户名字段-->
<entry key="username" value="username"/>
</map>
</property>
<property name="resultAttributeMapping">
<map>
<!--key为对应的数据库字段名称,value为提供给客户端获取的属性名字,系统会自动填充值-->
<entry key="id" value="uid"/>
<entry key="username" value="username"/>
<entry key="password" value="password"/>
<entry key="email" value="email"/>
<entry key="cnName" value="cname"/>
</map>
</property>
<!--
<property name="queryType">
<value>OR</value>
</property>
-->
</bean>
4.2 配置返回字段
<util:list id="registeredServicesList">
<bean class="org.jasig.cas.services.RegexRegisteredService"
p:id="0" p:name="HTTP and IMAP" p:description="Allows HTTP(S) and IMAP(S) protocols"
p:serviceId="^(https?|imaps?)://.*" p:evaluationOrder="10000001">
<!-- 这里是重点 -->
<property name="allowedAttributes">
<list>
<value>uid</value>
<value>username</value>
<value>password</value>
<value>email</value>
<value>cname</value>
</list>
</property>
</bean>
...
到这里cas服务端的配置基本完成了。good luck。