基于CAS的单点登录实战(1)-- 搭建cas服务器
公司有几个系统想做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。
基于CAS的单点登录实战(1)-- 搭建cas服务器的更多相关文章
- 基于CAS的单点登录实战(2)-- 搭建cas的php客户端
在这之前已经搭好了CAS服务端 基于CAS的单点登录实战(1)-- 搭建cas服务器 PHP-Client php-Client是官方支持的,去官网下个最新版就好了.phpCAS 接入很简单,解压放到 ...
- [精华][推荐]CAS SSO 单点登录框架学习 环境搭建
1.了解单点登录 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用( ...
- 手把手教你学会 基于JWT的单点登录
最近我们组要给负责的一个管理系统 A 集成另外一个系统 B,为了让用户使用更加便捷,避免多个系统重复登录,希望能够达到这样的效果--用户只需登录一次就能够在这两个系统中进行操作.很明显这就是单点登 ...
- 基于SAML的单点登录介绍
http://blog.csdn.net/csethcrm/article/details/20694993 一.背景知识: SAML即安全断言标记语言,英文全称是Security Assertion ...
- CAS实现单点登录SSO执行原理及部署
一.不落俗套的开始 1.背景介绍 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS框架:CAS(Centra ...
- Spring Security 集成CAS实现单点登录
参考:http://elim.iteye.com/blog/2270446 众所周知,Cas是对单点登录的一种实现.本文假设读者已经了解了Cas的原理及其使用,这些内容在本文将不会讨论.Cas有Ser ...
- CAS单点登录实践(spring cas client配置)
前言: 最近的项目需要将多个站点统一登录,查阅了资料Jasig cas(Central Authentication Service)(官方站点:http://www.jasig.org/cas)使用 ...
- cas实现单点登录原理
1.基于Cookie的单点登录的回顾 基于Cookie的单点登录核心原理: 将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从 ...
- Cas(07)——建立使用Cas进行单点登录的应用
建立使用Cas进行单点登录的应用 目录 1.1加入cas-client-core-xxx.jar到classpath 1.2配置Filter 1.2.1AuthenticationFilter 1.2 ...
随机推荐
- U-boot分析与移植(2)----U-boot stage1分析
我们要生成u-boot.bin文件,它首先依赖于很多.o文件和.lds链接脚本文件 我们只要找到对应的.lds链接脚本文件就可以分析u-boot的启动流程. 1.打开u-boot-1.1.6\u-bo ...
- 缓存 memcached 与 redis
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- flask系列二之基础知识
一.调试模式(debug模式) 1.设置debug模式 在app.run()中传入关键字参数debug,app.run(debug=Ture),就设置当前项目为debug模式.如下所示: # 从fla ...
- 04.CSS的继承性和层叠性
CSS有两大特性: 继承性和层叠性 继承性 面向对象语言都会存在继承的概念 , 在面向对象语言中, 继承的特点: 继承了父类的属性和方法. 那么 css 就是在设置属性的 , 不会牵扯到方法 ...
- Django Rest Framework 4
目录 一.分页 二.视图 三.路由 四.渲染器 一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一 ...
- Easyui Datagrid 如何实现后台交互显示用户数据列表
转自:https://blog.csdn.net/Tomsheng321/article/details/50722571?utm_source=blogxgwz9 新手初学的时候可能有个疑问:如何在 ...
- 嵌入式Linux启动配置文件及脚本分…
使用Busybox制作根文件系统时,/etc目录非常重要,它包含了嵌入式Linux启动所需的配置文件及脚本.由于init进程,或者说linuxrc程序会解析inittab文件,因此就从/etc/ini ...
- Timer定时函数的用法
- shell 别名alias
在这说下 shell 命令 alias 别名 看个人爱好 设置. 直接执行命令 显示当前所有别名 alias 别名='新的别名' 该命令在当窗口关闭以后 会失效 想要永久生效 需要在 ...
- Cannot connect to the Docker datemon at tcp://0.0.0.0:2375 is the docker daemon runing?
一.系统环境: 在Windows 7 64位上,采用Vmware workstation 12安装了CenOS7.5 64位. 二.问题 在CentOS7.5里安装了Docker,启动docker服务 ...