`
schy_hqh
  • 浏览: 556041 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

SSO-CAS单点登录(一)

 
阅读更多

https://wiki.jasig.org/display/CASUM/Home

http://downloads.jasig.org/cas-clients/

 

 

CAS(Central Authentication Server)

 

SSO CAS 单点登录
目标:一个CAS服务,2个以上的独立项目
在CAS服务器上登录成功后,即可访问关联到该CAS服务上的子项目
在任意子项目上进行注销,再访问其它项目将需要重新登录
以下内容,基于cas-server-3.4.10 和 cas-client-3.2.1
====================================================================
第一步 制作密钥与证书
使用Java的keytool生成密钥,并将其存放到指定的密钥库中
Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中

参数:
-alias 密钥的别名(唯一)
-keyalg 加密算法
-keystore 指定生成的keystore存放位置
-storepass  指定密钥库的口令
-dname 配置密钥发布者相关信息
      CN 服务器域名,本地测试用localhost(或者修改host文件,127.0.0.1 sso.gc.com)
      OU 组织单位名称        
      O  组织名称          
      L  城市或区域名称
      ST 省/市/自治区名称
      C  双字母国家/地区代码
-keypass 访问具体密钥的口令
-validity 密钥的有效期(默认90天)

【生成keystore】
keytool -genkey -alias gc -keyalg RSA -keystore e:/keys/mykeystore -storepass 111111 -dname "CN=sso.gc.com, OU=gc.com, O=gc.com, L=bj, ST=bj, C=cn" -keypass 111111  -validity 365
注意:上面的命令中,CN指定的域名是通过host文件中配置的(127.0.0.1  sso.gc.com)

从keystore密钥库导出证书
服务端(提供CAS服务,如Tomcat),在8443端口处配置keystore
客户端则需要将证书导入到JVM中
参数:
-alias 上一步所指定的密钥别名
-keystore  上一步指定的密钥库地址
-storepass  上一步指定的密钥库口令
-file     指定即将导出的证书的存放地址
【从keystore导出证书】
keytool -export -alias gc -keystore e:/keys/mykeystore -storepass 111111 -file e:/keys/gckey.crt


客户端拿到证书后,将证书导入到的JVM中
(客户端只需要JRE即可,所以客户端的证书库在JRE目录下!)
cacerts证书文件(The cacerts Certificates File)
该证书文件存在于java.home\jre\lib\security目录下,是Java系统的CA证书仓库
将上面生成的证书导入到客户端的JVM中
参数:
-trustcacerts 信任的证书
-alias 证书别名
-keystore 客户端keystore的地址
-storepass 客户端keystore口令
-file   被导入的证书的位置
【客户端:导入证书】
keytool -import -trustcacerts -alias gc -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit -file e:/keys/gckey.crt
注意:-storepass 为changeit,该密码是java证书库的密码,不是前面设置的111111

查看证书库里面的证书信息
keytool -list -v -alias gc -keystore  e:/keys/mykeystore -storepass 111111
查看客户端JVM中的证书信息
keytool -list -v -alias gc -keystore  "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit

删除证书库里面的某个证书
keytool -delete -alias gc -keystore e:/keys/mykeystore -storepass 111111
删除客户端JVM中的证书信息
keytool -delete -alias gc -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
 
====================================================================
第二步 配置CAS服务器
以Tomcat为例,放开8843端口,配置如下
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" 
SSLEnabled="true" maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" 
keystoreFile="e:/keys/mykeystore" keystorePass="111111"/>
并放开此配置
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
 
配置CAS中的cas-server-webapp模块
打开E:\learning\cas\cas\cas-server-3.4.10\cas-server-webapp\src\main\webapp\WEB-INF\deployerConfigContext.xml
替换认证方式,默认配置是用户名密码相同即认证通过
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
 
配置新的认证方案:根据登录账号查询数据库中存储的密码,进行用户验证
如果数据库中存储的密码通过加密存储的,如MD5加密,可通过配置加密器
修改为通过数据库查询用户名对应的密码进行认证
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
	property name="dataSource" ref="dataSource"
	property name="sql" value="select password from t_admin_user where login_name = ?"
	<!-- property name="passwordEncoder" ref="MD5PasswordEncoder" -->
/>

<!-- JDBC数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
   <property name="url"><value>jdbc:mysql://localhost:3306/gc</value></property>
   <property name="username"><value>root</value></property>
   <property name="password"><value>root</value></property>
</bean>
 
<!-- MD5加密后与数据库查询得到的密码进行比对 -->
<bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
	<constructor-argindex="0">
		<value>MD5</value>
	</constructor-arg>
</bean>
 
由于需要访问数据库,所以需要向cas-server-webapp项目中增加数据库驱动
通过Maven来导入需要的jar包
手动将cas-server-support-jdbc-3.4.10.jar发布到私服上
注意:-DrepositoryId配置的是maven中settings.xml中配置的仓库id,如果这里配错了,将无法deploy,发生401,ReasonPhrase: Unauthorized.
mvn deploy:deploy-file -DgroupId=org.jasig.cas -DartifactId=cas-server-support-jdbc -Dversion=3.4.10 -Dpackaging=jar -Dfile=E:\learning\cas\cas\cas-server-3.4.10\modules\cas-server-support-jdbc-3.4.10.jar -Durl=http://localhost:8081/nexus/content/repositories/releases/ -DrepositoryId=nexus-releases
 为cas-server-webapp添加依赖,这样打好的war包中就包含了这2个jar,而不用每次都手动拷贝到WEB-INF/lib中
<!-- CAS服务访问数据库的接口 -->
<dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-support-jdbc</artifactId>
		<version>3.4.10</version>
</dependency>

<!-- Mysql数据库连接器 -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.28</version>
</dependency>
以Mysql为例,创建数据库gc,新建t_admin_user表,插入一个用户
create table t_admin_user (
    id bigint not null auto_increment,
    email varchar(255),
    login_name varchar(255) not null unique,
    name varchar(255),
    password varchar(255),
    primary key (id)
) ENGINE=InnoDB;

insert into t_admin_user (email,login_name,name,password) values ('gc@gc.com','hqh','hqh','123');
 
使用Maven对cas-server-webapp进行打包
E:\learning\cas\cas\cas-server-3.4.10\cas-server-webapp>mvn package
将war包拷贝到tomcat的webapps下
重启tomcat
访问:https://sso.gc.com:8443/cas/login
输入用户名和密码,CAS SERVER将从数据库中查询uasername对应的密码进行验证,如果一致,则认证通过


 
点击继续浏览

输入用户名和密码(数据库中存储的用户名hqh和密码123)

 
到此,服务端配置结束。
====================================================================
第三步 配置客户端
 准备2个需要用户验证的项目,项目A,项目B
用户登录的基本做法:
使用filter对项目中所有内容进行过滤(除了访问LoginServlet)
在LoginServlet中,获取用户名和密码,如果验证成功,则将用户存入HttpSession中
否则,重定向到登录页面
现在通过CAS进行单点登录,项目A与项目B 就不需要进行登录验证了
验证都集中在CAS中进行,一旦在CAS验证通过,访问项目A与项目B将不需要登录了。
取消当前项目中对用户登录的验证,下面开始使用CAS客户端进行登录控制
在项目A与项目B中增加对cas-client-core的依赖
<dependency>
	<groupId>org.jasig.cas.client</groupId>
  	<artifactId>cas-client-core</artifactId>
  	<version>3.2.1</version>
</dependency>
 
配置项目A(服务地址:http://localhost:8088/client
打开项目A的web.xml
添加如下Filter
<!-- 单点登陆开始 -->
	<filter>
		<filter-name>CAS Single Sign Out Filter</filter-name>
		<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
	</filter>
	<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.gc.com:8443/cas/login</param-value>
		</init-param>
		<init-param>
			<param-name>serverName</param-name>
			<param-value>http://localhost:8088</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.gc.com:8443/cas</param-value>
		</init-param>
		<init-param>
			<param-name>serverName</param-name>
			<param-value>http://localhost:8088</param-value>
		</init-param>
		<init-param>
			<param-name>redirectAfterValidation</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<param-name>tolerance</param-name>
			<param-value>5000</param-value>
		</init-param>
	</filter>
	<filter>
		<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
		<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
	</filter>
	<filter>
		<filter-name>CAS Assertion Thread Local Filter</filter-name>
		<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>CAS Single Sign Out Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS Authentication Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS Validation Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS Assertion Thread Local Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 单点登陆结束 -->
 
配置项目B(服务地址:http://localhost:8888/client
打开项目A的web.xml添加如下Filter
<!-- 单点登陆开始 -->
	<filter>
		<filter-name>CAS Single Sign Out Filter</filter-name>
		<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
	</filter>
	<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.gc.com:8443/cas/login</param-value>
		</init-param>
		<init-param>
			<param-name>serverName</param-name>
			<param-value>http://localhost:8888</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.gc.com:8443/cas</param-value>
		</init-param>
		<init-param>
			<param-name>serverName</param-name>
			<param-value>http://localhost:8888</param-value>
		</init-param>
		<init-param>
			<param-name>redirectAfterValidation</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<param-name>tolerance</param-name>
			<param-value>5000</param-value>
		</init-param>
	</filter>
	<filter>
		<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
		<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
	</filter>
	<filter>
		<filter-name>CAS Assertion Thread Local Filter</filter-name>
		<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>CAS Single Sign Out Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS Authentication Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS Validation Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CAS Assertion Thread Local Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 单点登陆结束 -->
重启项目A与项目B
均跳转到了CAS登录页面

 选择一个页面进行登录,登录成功后,再访问另一个项目,将不需要登录了
如,访问http://localhost:8088/client/main.jsp,在跳转到的页面上进行登录,成功后跳转到

 
当项目A登录成功,再访问项目B 时,不需要再登录了

 
 注销功能
在任何一个项目注销后,CAS所关联的子项目都被注销
web.xml中加入LogoutServlet
<!-- 注销登录 -->
<servlet>
	<servlet-name>logoutServlet</servlet-name>
	<servlet-class>com.gc.user.web.LogoutServlet</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>logoutServlet</servlet-name>
	<url-pattern>/logoutServlet</url-pattern>
</servlet-mapping>
 
增加一个LogoutServlet类
package com.gc.user.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LogoutServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doSingleSignOut(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}
	
	public void doSingleSignOut(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
	{
	  response.sendRedirect("https://sso.gc.com:8443/cas/logout");
	}
}
页面提供注销按钮或链接
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div align="right">
		<a href="/client/logoutServlet">注销</a>
	</div>
	<h1>8088端口,项目A的一个很重要的页面</h1>
</body>
</html>
 
CAS单点登录到此只能算走通了一个流程,学了一丁点的皮毛,我仍需努力啊!
 
 
  • 大小: 55.4 KB
  • 大小: 68 KB
  • 大小: 64.5 KB
  • 大小: 97.9 KB
  • 大小: 34.2 KB
  • 大小: 39.9 KB
分享到:
评论

相关推荐

    单点登录sso-shiro-cas-maven

    spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次 ## 系统模块说明 1. cas: 单点登录模块,这里直接拿的是cas的项目改了点样式而已 2. doc: 文档目录,里面有数据库生成语句,采用的...

    sso/cas单点登录Java maven版 含服务端客服端

    SSO(Single Sign-On)是单点登录的缩写,是一种网络用户身份验证的机制,允许用户在一次登录后访问多个应用系统而无需再次验证。CAS(Central Authentication Service)是SSO的一种实现,由耶鲁大学开发并开源,它...

    .net-casSSO-client.rar

    .NET CAS SSO客户端是一款专为.NET开发者设计的身份验证解决方案,它允许用户通过中央认证服务(Central Authentication Service,简称CAS)实现单点登录(Single Sign-On,简称SSO)。CAS是一种开放源码的Web身份...

    java-cas单点登录服务端

    单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 CAS(Central Authentication ...

    spring boot 实现SSO单点登陆

    spring boot整合spring security 实现SSO单点登陆 完整DEMO. 1、配置本地hosts 127.0.0.1 sso-login 127.0.0.1 sso-resource 127.0.0.1 sso-tmall 127.0.0.1 sso-taobao windows系统的路径在C:\WINDOWS\system...

    小蚂蚁-CAS单点登录系列(3)-简单实施SSO

    【标题】:“小蚂蚁-CAS单点登录系列(3)-简单实施SSO” 单点登录(Single Sign-On,简称SSO)是一种网络身份验证机制,它允许用户在多个应用程序之间共享登录状态,只需要进行一次身份验证。在这个系列的第三部分中...

    小蚂蚁-CAS单点登录系列(5)-简单实施SSO之二

    《小蚂蚁-CAS单点登录系列(5)-简单实施SSO之二》 单点登录(Single Sign-On,简称SSO)是企业信息化系统中一个重要的功能,它允许用户通过一次登录,就能访问多个相互独立的应用系统,无需多次输入用户名和密码。本...

    SSO之CAS单点登录详细图文教程.zip

    总之,“SSO之CAS单点登录详细图文教程.zip”是一个全面的指南,它将引导你通过每一步操作,实现CAS服务端和客户端的集成,最终搭建起一个可靠的SSO系统。在阅读文档和实践操作的过程中,你将深入理解SSO的工作原理...

    CAS单点登录SSO( Single Sign-On)

    CAS单点登录协议是解决多应用系统认证问题的有效方案。通过深入学习和理解CAS的工作机制,开发者能够更好地实现和维护安全、高效的SSO系统。同时,源码分析有助于定制化需求和故障排查,确保CAS在实际环境中的稳定...

    sso.rar_DotNetCasClient.dll_sso_sso 单点登录_单点登录_鍗曠偣鐧诲綍

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证技术,允许用户在一次登录后,无需再次输入凭证即可访问多个相互关联的应用系统。在IT领域,它极大地提升了用户体验和安全性,尤其对于大型企业或组织,管理...

    SSO之CAS单点登录详细教程.docx

    SSO之CAS单点登录详细教程.docx

    CAS--SSO单点用到的jar包

    CAS(Central Authentication Service)是一种广泛使用的开放源代码的单点登录(Single Sign-On,简称SSO)框架。SSO允许用户在访问多个应用系统时只需要进行一次身份验证,之后访问其他系统无需再次输入凭证,提高...

    SSO之CAS单点登录

    综上所述,SSO之CAS单点登录提供了一种高效、安全的身份验证解决方案,简化了用户访问多应用的流程,同时也便于管理员管理和监控用户行为。对于大型组织,采用CAS进行SSO集成可以显著提升用户体验并加强信息安全。在...

    SSO之CAS单点登录实例演示

    通过"SSO之CAS单点登录实例演示",我们可以实践这些步骤,了解如何设置和运行一个基本的CAS环境,进一步理解SSO的工作原理和实际应用。这个实例将帮助我们更好地掌握如何为自己的应用实现SSO功能,提升系统的安全性...

    SSO之CAS单点登录详细图文教程

    SSO(Single Sign-On)单点登录是一种网络身份验证机制,允许用户在多个相互关联的应用系统之间共享登录状态,只需一次登录即可访问所有系统。在这个详细的CAS(Central Authentication Service)单点登录教程中,...

    SSO之CAS单点登录客户端服务端jar包

    在"SSO之CAS单点登录客户端服务端jar包"中,包含的是实现CAS单点登录功能所需的客户端和服务端组件。这些jar包包含了以下关键知识点: 1. **CAS服务器**:这是整个SSO架构的核心,负责处理用户的登录请求,验证凭证...

    Java进阶SSO单点登录技术CAS-快速上手与原理探究视频教程

    本课程主要通过CAS来实现SSO,本教程会从最基本的基础知识讲起,由浅入深再到实战,完成多应用的单点登录功能。 本课程内容如下: 1、 什么是SSO和CAS 2、 CAS Server服务端和客户端的搭建和配置 3、 单点登录和单...

    网上简单的SSO CAS 单点登录源码

    本源码集合为一个简单的Java实现的SSO CAS单点登录示例,适合初学者理解和实践SSO原理。 首先,我们需要理解SSO的基本流程: 1. 用户尝试访问受保护的应用A。 2. 应用A发现用户未登录,重定向到CAS服务器的登录页面...

Global site tag (gtag.js) - Google Analytics