最近项目需要,需要做一个单点登陆的功能,由于之前没有接触过SSO,不是很了解,查阅资料后 选择使用CAS作为研究对象。CAS是有耶鲁大学研发的单点登录服务器。
借鉴了:http://blog.csdn.net/small_love/article/details/6664831的经验,
1.开发环境
2.开发步骤大致分为三部
3.生成证书
证书对于实现此单点登录非常之重要,证书是服务器端和客户端安全通信的凭证,本教程只是演示,所有用了 JDK自带的证书生成工具keytool。
1. 生成证书
命令:keytool -genkey -alias sslverisign -keyalg RSA -keystore D:/keys/smallkey
其中sslverisign是生成证书的一个别名 自定义 D:/keys/smallkey 是生成的路径 一定要确保生成的路径是存在的,smallkey会自己创建。
命令执行后如下图:
其中名字与姓氏这一最好写你的域名,如果在单击测试你可以在C:\Windows\System32\drivers\etc\hosts文件中映射一个虚拟域名。
不要写IP 其中红字部分非常重要,在后面还会用到。
配置本地虚拟域名的方法为:C:\Windows\System32\drivers\etc\hosts 找到hosts文件 打开编辑输入如下:
配置的时候 该文件有时候无法修改不能保存,自个百度吧 有解决方案。
2.导出证书
C:\>keytool -export -file d:/keys/ssl.crt -alias sslverisign -keystore d:/keys/smallkey
ssl.crt 为生成证书的名字 sslverisign为第一步生成的证书别名
执行后 如下图:
密码为第一步自己所设定的密码
3.把证书导入到客户端JDK中
命令:keytool -import -keystore C:\Java\jdk1.7.0_15\jre\lib\security\cacerts -file D:/keys/ssl.crt -alias sslverisign
执行如下:
导入成功.
该步骤容易出现的问题就是:
1.keytool错误: java.io.IOException: Keystore was tampered with, or password was incorrect
错误的解决方法是,把%JAVA_HOME%\lib\security下的cacerts文件删除掉,在执行
2. 还有就是jdk存放的位置路径如果存在空格也会导致导入证书不成功,提示非法(默认安装jdk的时候如:C:\Program Files 存在空格 将会导致导入不成功),需要注意。
4.配置服务端
1、 下载CAS的服务端cas-server-4.0.0-release.zip解压,把解压后的文件中modules文件夹中的cas-server-webapp-4.0.0.war文件拷贝的D:\apache-tomcat7\webapps目录下并改重命名为cas.war 下载地址:http://downloads.jasig.org/cas/
2、修改D:\apache-tomcat7\conf\server.xml文件去掉此文件83到93行之间的注释,修改为:
keystoreFile="D:/keys/smallkey" <!--生成证书的时候的路径-->
keystorePass="smalllove"/> <!--在生成证书的时候设置的密码-->
设置完成后手动启动tomcat:D:\apache-tomcat7\bin\startup.bat 点击该bat文件运行。
如果运行出现如下错误 导致启动不成功。
严重: Failed to initialize end point associated with ProtocolHandler ["http-apr-443"]
java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR
需要修改D:\apache-tomcat7\conf\server.xml 找到如下注释掉:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
3、以上配置完成访问https://www.deng.com:8443/cas出现以下页面
点击继续浏览此网页,后出现
由于我们用的是cas4.0的版本 所以默认的初始账号是密码是 casuser Mellon 之前看很多教程用的是3.4的版本 那时候初始账号和密码是admin
输入账号密码后 会出现如下界面 表示登陆成功 服务器端配置完成。
5.配置客户端
下载客户端:http://downloads.jasig.org/cas-clients/,目前最新版本为:cas-client-3.3.3,然后解压cas-client-3.1.12.zip,在modules文件夹中有需要的jar包(cas-client-core-3.3.3.jar,jul-to-slf4j-1.6.1.jar,log4j-over-slf4j-1.6.1.jar,slf4j-api-1.7.1.jar).
由于自己要做测试测试两个项目登陆后是否能实现单点,在单独部署一个tomcat服务器(加之前部署修改的一共两个),如果是解压包的tomcat,就把之前的tomcat复制一个出来,打开D:\apache-tomcat-7.0.40\conf\server.xml文件,修改他的端口号保证两个tomcat启动后不冲突。
第22行修改后 <Server port="8055" shutdown="SHUTDOWN">
第70到74 修改后
<Connector port="18080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="18443" />
第97行 修改后
<Connector port="18009" protocol="AJP/1.3" redirectPort="18443" />
登陆新建两个WEB工程 打开web.xml文件配置如下信息,我cas服务器用的默认的tomcat端口号,所以web项目我部署在后面修改端口后的tomcat上18080:
两个web工程配置一样 可以在默认的index.html页面上标注一下区别。
1 <!-- ======================== 单点登录开始 ======================== --> 2 <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 --> 3 <listener> 4 <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> 5 </listener> 6 7 <!-- 该过滤器用于实现单点登出功能,可选配置。 --> 8 <filter> 9 <filter-name>CAS Single Sign Out Filter</filter-name> 10 <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> 11 </filter> 12 <filter-mapping> 13 <filter-name>CAS Single Sign Out Filter</filter-name> 14 <url-pattern>/*</url-pattern> 15 </filter-mapping> 16 17 <!-- 该过滤器负责用户的认证工作,必须启用它 --> 18 <filter> 19 <filter-name>CASFilter</filter-name> 20 <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> 21 <init-param> 22 <param-name>casServerLoginUrl</param-name> 23 <param-value>https://www.deng.com:8443/cas/login</param-value> 24 <!--这里的server是服务端的IP --> 25 </init-param> 26 <init-param> 27 <param-name>serverName</param-name> 28 <param-value>http://www.deng.com:18080</param-value> 29 </init-param> 30 </filter> 31 <filter-mapping> 32 <filter-name>CASFilter</filter-name> 33 <url-pattern>/*</url-pattern> 34 </filter-mapping> 35 36 <!-- 该过滤器负责对Ticket的校验工作,必须启用它 --> 37 <filter> 38 <filter-name>CAS Validation Filter</filter-name> 39 <filter-class> 40 org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> 41 <init-param> 42 <param-name>casServerUrlPrefix</param-name> 43 <param-value>https://www.deng.com:8443/cas</param-value> 44 </init-param> 45 <init-param> 46 <param-name>serverName</param-name> 47 <param-value>http://www.deng.com:18080</param-value> 48 </init-param> 49 </filter> 50 <filter-mapping> 51 <filter-name>CAS Validation Filter</filter-name> 52 <url-pattern>/*</url-pattern> 53 </filter-mapping> 54 55 <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 --> 56 <filter> 57 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 58 <filter-class> 59 org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> 60 </filter> 61 <filter-mapping> 62 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 63 <url-pattern>/*</url-pattern> 64 </filter-mapping> 65 66 <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 --> 67 <filter> 68 <filter-name>CAS Assertion Thread Local Filter</filter-name> 69 <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> 70 </filter> 71 <filter-mapping> 72 <filter-name>CAS Assertion Thread Local Filter</filter-name> 73 <url-pattern>/*</url-pattern> 74 </filter-mapping> 75 76 <!-- ======================== 单点登录结束 ======================== -->
配置完成后手动启动cas所属的tomcat,确认没有报错后,在eclipse部署两个web功能,然后eclipse里启动tomcat部署的两个项目。
博主建了两个简单的功能 工程名为:
启动完成后 网页输入项目任意一个项目的地址进行测试。
打开后都自动跳转到如下界面,打开另外一个项目也是如此。
登陆测试账号,验证通过后,就会返回到该项目的index页面。打开另一个项目也会跳转到对应的index页面。不会被拦截登陆。至此说明配置单点登陆成功。
5.配置数据库
目前使用的是默认账号登陆的的情况,但是要是连接到数据库又怎么办呢。下面cas服务器如何配置数据库。我使用的数据库是mysql
1. 打开cas服务器所属的tomcat 找到D:\apache-tomcat7\webapps\cas\WEB-INF\lib。加入几个依赖包(cas-server-support-jdbc-4.0.0.jar,commons-dbcp-1.4.jar,commons-pool-1.6.jar,mysql-connector-java-5.0.8-bin.jar)
其中cas-server-support-jdbc-4.0.0.jar可以在cas-server-4.0.0\modules目录下找到 其他的需要自行下载了。
2.打开D:\apache-tomcat7\webapps\cas\WEB-INF\deployerConfigContext.xml,找到如下默认的账号密码 注释掉。
然后新增:
1 <bean id="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> 2 <property name="dataSource" ref="dataSource" /> 3 <property name="sql" value="select password from ms_user where user_code=?" />
<!-- 上面这句写自己数据库sql -->
4 </bean>
5<!-- MySQL connector -->
6 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 7 <property name="driverClassName"> 8 <value>com.mysql.jdbc.Driver</value> 9 </property> 10 <property name="url"> 11 <value>jdbc:mysql://localhost:3306/test</value> 12 </property> 13 <property name="username"> 14 <value>数据库账号</value> 15 </property> 16 <property name="password"> 17 <value>数据库密码</value> 18 </property> 19 </bean>
修改完成后再重新启动cas服务端的tomcat服务器 cas登陆页面就需要登陆自己数据库的账号才能登陆了。
原文:http://www.cnblogs.com/ButterFuture/p/4721787.html