- 浏览: 494707 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (301)
- Swing技术 (1)
- Linux (1)
- Javascript (22)
- 数据结构和算法 (3)
- J2SE (36)
- workflow (5)
- 设计模式 (14)
- web service (19)
- Ajax (14)
- 中间件 & 服务器 (8)
- 多线程 (9)
- Oracle (52)
- sys & soft (10)
- JMS (3)
- sso (9)
- android (11)
- struts2 (10)
- web协议 (2)
- 分布式 (2)
- PM (2)
- OLAP (3)
- Redis (2)
- Hibernate (7)
- ibatis (2)
- SQLServer (1)
- maven (3)
- Spring (7)
- Jsp (2)
- slf4j (1)
- jQuery (15)
- 权限 (1)
- 系统集成 (1)
- 笔记 (1)
- Freemarker (2)
- 项目管理 (1)
- eclipse (3)
- GIS (1)
- NoSql (3)
- win10 (1)
- win10网络 (2)
- 底层 (3)
- 数据库 (0)
最新评论
-
kabuto_v:
请问那种图,uml图是怎么画出来的呢?是您自己手工画的,还是有 ...
FastJSON 序列化、反序列化实现 -
梦行Monxin商城系统:
电商实例、业务并发、网站并发及解决方法 -
rockethj8:
client 㓟有一个参数是可以忽略一些URL 不进行验证登录 ...
SSO 之 (单点登录)实施中遇到的几个问题 -
mengxiangfeiyan:
好啊。。。。。
Oracle删除表,删除数据以及恢复数据、利用现有表创建新表
http://www.sparkfood.com/2010/0821/3907.html
环境篇
一、所需软件
Jdk:jdk1.6.0_13
Apache:httpd-2.2.15-win32-x86-openssl-0.9.8m-r2
Tomcat:apache-tomcat-6.0.10
jks2pfx:证书导出工具
memcache:memcached-1.2.1-win32(需要memcache集群环境)
二、安全证书生成
1、keytool
Apache、tomcat、jdk需要使用安全证书,进windows command窗口生成证书,命令如下:
--生成证书库
keytool -genkey -alias 800jit -keyalg RSA -keystore d:/cert/800jitkey
--从证书库中到处证书
keytool -export -file d:/cert/800jit.crt -alias 800jit -keystore d:/cert/800jitkey
--把证书导入jdk的证书库
keytool -import -keystore d: /jdk1.6.0_13/jre/lib/security/cacerts -file d:/cert/800jit.crt -alias 800jit
--生成Apache服务器的SSL连接需要配置私钥文件和证书文件
D:\casex\jks2pfx>JKS2PFX.bat .keystore 800jitkey tomcat server_dev00
生成的server_dev00.crt,server_dev00.key放到D:/work/Apache2.2/conf/
2、openssl
openssl req -config ..\conf\openssl.cnf -new -out olymtech.csr
openssl rsa -in privkey.pem -out olymtech.key
openssl x509 -in olymtech.csr -out olymtech.cert -req -signkey olymtech.key -days 3650
openssl x509 -in olymtech.cert -out olymtech.der.crt -outform DER
keytool -import -keystore d:/work/jdk1.6.0_13/jre/lib/security/cacerts -file d:/casex/ssl/olymtech.crt -alias olymtech
keytool -import -keystore D:/casex/800jitkey -file D:/casex/cas-doc/ssl/olymtech.crt -alias olymtech
三、Apache配置
Apache+ssl+虚拟机
--修改http.conf文件
取消注释 LoadModule ssl_module modules/mod_ssl.so
取消注释 Include conf/extra/httpd-ssl.conf
取消注释 Include conf/extra/httpd-vhosts.conf
ProxyPass /cas balancer://cas lbmethod=bytraffic stickysession=jsessionid
<proxy balancer://cas/>
BalancerMember ajp://192.168.1.190:10009/cas loadfactor=1 route=jvm1
BalancerMember ajp://192.168.1.190:8009/cas loadfactor=1 route=jvm2
</proxy>
--修改httpd-ssl.conf
在<VirtualHost _default_:443>下增加
ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid
ProxyPassReverse /cas balancer://cas/
SSLProxyEngine On
修改
SSLCertificateFile "D:/work/Apache2.2/conf/server_dev00.crt"
SSLCertificateKeyFile "D:/work/Apache2.2/conf/server_dev00.key"
--修改httpd-vhosts.conf
在<VirtualHost *:80>下增加
ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid
ProxyPassReverse /cas balancer://cas/
四、Tomcat配置
修改server.xml
--配置ssl
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="d:/work/apache-tomcat-6.0.10/conf/800jitkey"
keystorePass="111111" />
五、session共享(Tomcat)
六、memcache集群
CAS SERVER篇
一、CAS 原理介绍
访问流程图
主要原理:用户第一次访问一个CAS 服务的客户web 应用时(访问URL : ),部署在客户web 应用的cas AuthenticationFilter ,会截获此请求,生成service 参数,然后redirect 到CAS 服务的login 接口,url为 ,认证成功后,CAS 服务器会生成认证cookie ,写入浏览器,同时将cookie 缓存到服务器本地,CAS 服务器还会根据service 参数生成ticket,ticket 会保存到服务器,也会加在url 后面,然后将请求redirect 回客户web 应用,url 为 。这时客户端的AuthenticationFilter 看到ticket 参数后,会跳过,由其后面的TicketValidationFilter 处理,TicketValidationFilter 会利用httpclient 工具访问cas 服务的/serviceValidate 接口, 将ticket 、service 都传到此接口,由此接口验证ticket 的有效性,TicketValidationFilter 如果得到验证成功的消息,就会把用户信息写入web 应用的session里。至此为止,SSO 会话就建立起来了,以后用户在同一浏览器里访问此web 应用时,AuthenticationFilter 会在session 里读取到用户信息,所以就不会去CAS 认证,如果在此浏览器里访问别的web 应用时,AuthenticationFilter 在session 里读取不到用户信息,会去CAS 的login 接口认证,但这时CAS 会读取到浏览器传来的cookie ,所以CAS 不会要求用户去登录页面登录,只是会根据service 参数生成一个ticket ,然后再和web 应用做一个验证ticket 的交互。
二、CAS 服务端的处理逻辑
CAS 服务端总共对外定义了9 个接口,客户端通过访问这9 个接口与服务端交互,这9个接口为:
接口
说明
备注
/login
认证接口
/logout
退出接口,负责销毁认证cookie
/validate
验证ticket 用的接口,CAS1.0 定义
/serviceValidate
验证ticket 用的接口,CAS2.0 定义,返回xml 格式的数据
/proxy
支持代理认证功能的接口
/proxyValidate
支持代理认证功能的接口
/CentralAuthenticationService
用于和远程的web services 交互
/remoteLogin(新增)
认证接口
/directLogin(新增)
认证接口
详细说明:
/login:
登录流程这部分要考虑到不同种类用户凭证的获取方案,以及客户应用传来的service 、gateway 、renew 参数的不同取值组合,CAS 为了实现流程的高度可配置性,采用了Spring Web Flow 技术。通过CAS 发布包里的login-webflow.xml 、cas-servlet.xml 、applicationContext.xml 这3 个文件,找出 了登录有关的所有组件,画出处理流程图。
CAS 默认的登录处理流程
第一次访问Web 应用的流程走向
已经登录web1 后,访问web1 的资源(web1 没有启动session ),或访问web2 的资源
注:
1 : InitialFlowSetupAction: 是流程的入口。用 request.getContextPath() 的值来设置 cookie 的 Path 值, Cookie 的 path 值是在配置文件里定义的,但这个 Action 负责将 request.getContextPath() 的值设置为 Cookie 的 path 值,这是在 cas 部署环境改变的情况下,灵活地设置 cookie path 的方式;把 cookie 的值以及 service 参数的值放入 requestContext 的 flowscope 里。
2 : GenerateServiceTicketAction 此 Action 负责根据 service 、 GTC cookie 值生成 ServiceTicket 对象, ServiceTicket 的 ID 就是返回给客户应用的 ticket 参数,如果成功创建 ServiceTicket ,则转发到 WarnAction ,如果创建失败,且 gateway 参数为 true ,则直接redirect 到客户应用, 否则则需要重新认证。
3 : viewLoginForm 这是登录页面, CAS 在此收集用户凭证。 CAS 提供的默认实现是 /WEB-INF/view/jsp/simple/ui/casLoginView.jsp 。
4 : bindAndValidate 对应 AuthenticationViaFormAction 的 doBind 方法,该方法负责搜集登录页面上用户录入的凭证信息(用户名、密码等),然后把这些信息封装到 CAS 内部的 Credentials 对象中。用户在 casLoginView.jsp 页面上点击提交后,会触发此方法。
5:submit 对应 AuthenticationViaFormAction 的 submit 方法 , 如果 doBind 方法成功执行完, 则触发 submit 方法,此方法负责调用centralAuthenticationService 的 grantServiceTicket 方法,完成认证工作,如果认证成功,则生成 TicketGrantingTicket 对象,放在缓存里, TicketGrantingTicket 的 ID 就是 TGC Cookie 的 value 值。
6 : warn CAS 提供了一个功能:用户在一个 web 应用中跳到另一个 web 应用时, CAS 可以跳转到一个提示页面,该页面提示用户要离开一个应用进入另一个应用,可以让用户自己选择。用户在登录页面 viewLoginForm 上选中了 id=”warn” 的复选框,才能开启这个功能。
WarnAction 就检查用户有没有开启这个功能,如果开启了,则转发到showWarnView, 如果没开启,则直接redirect 到客户应用。
7 :SendTicketGrantingTicketAction 此Action 负责为response 生成TGC Cookie ,cookie 的值就是 AuthenticationViaFormAction 的submit 方法生成的 TicketGrantingTicket 对象的 ID 。
8 : viewGenerateLoginSuccess 这是 CAS 的认证成功页面。
/logout: ( 对应实现类 org.jasig.cas.web.LogoutController )
处理逻辑:
1) removeCookie
2) 在服务端删除TicketGrantingTicket 对象(此对象封装了cookie 的value 值)
3 )redirect 到退出页面,有2 种选择:
if(LogoutController 的followServiceRedirects 属性为true 值,且url 里的service 参数非空){
redirect 到 sevice 参数标识的url
}
else{
redirect 到内置的casLogoutView (cas/WEB-INF/view/jsp/default/ui/casLogoutView.jsp ),如果url 里有url 参数,则此url 参数标识的链接会显示在casLogoutView 页面上。
}
/serviceValidate: (对应实现类 org.jasig.cas.web.ServiceValidateController )
处理逻辑:
如果service 参数为空或ticket 参数为空,则转发到failureView (/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationFailure.jsp )
验证ticket 。以ticket 为参数,去缓存里找ServiceTicketImpl 对象,如果能找到,且没有过期,且ServiceTicketImpl 对象对应的service 属性和service 参数对应,则验证通过,验证通过后,请求转发至casServiceSuccessView (cas/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationSuccess.jsp ),验证不通过,则转发到failureView 。
三、认证相关的概念及流程
概念
Credentials 用户提供的用于登录用的凭据信息,如用户名/ 密码、证书、IP 地址、Cookie 值等。比如 UsernamePasswordCredentials ,封装的是用户名和密码。CAS 进行认证的第一步,就是把从UI 或request 对象里取到的用户凭据封装成Credentials 对象,然后交给认证管理器去认证。
AuthenticationHandler 认证Handler, 每种AuthenticationHandler 只能处理一种Credentials ,如AbstractUsernamePasswordAuthenticationHandler 只负责处理 U sernamePasswordCredentials 。
Principal 封装用户标识,比如 SimplePrincipal, 只是封装了用户名。认证成功后, credentialsToPrincipalResolvers 负责由Credentials 生成 Principal 对象。
CredentialsToPrincipalResolvers 负责由 Credentials 生成 Principal 对象,每种 CredentialsToPrincipalResolvers 只处理 一种Credentials ,比如 UsernamePasswordCredentialsToPrincipalResolver 负责从 U sernamePasswordCredentials 中取出用户名,然后将其赋给生成的 SimplePrincipal 的 ID 属性。
AuthenticationMetaDataPopulators 负责将 Credentials 的一些属性赋值给 Authentication 的 attributes 属性。
Authentication Authentication是认证管理器的最终处理结果, Authentication 封装了 Principal ,认证时间,及其他一些属性(可能来自 Credentials )。
AuthenticationManager 认证管理器得到 Credentials 对象后,负责调度AuthenticationHandler 去完成认证工作,最后返回的结果是 Authentication 对象。
CentralAuthenticationService CAS 的服务类,对 Web 层提供了一些方法。该类还负责调用 AuthenticationManager 完成认证逻辑。
序列图
类图
四、
CAS的核心就是其Ticket,及其在Ticket之上的一系列处理操作。CAS的主要票据有TGT、ST、PGT、PGTIOU、PT,其中TGT、ST是CAS1.0协议中就有的票据,PGT、PGTIOU、PT是CAS2.0协议中有的票据。
一 名词解释
TGT(Ticket Grangting Ticket)
TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后,CAS生成cookie,写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。
ST(Service Ticket)
ST是CAS为用户签发的访问某一service的票据。用户访问service时,service发现用户没有ST,则要求用户去CAS获取ST。用户向CAS发出获取ST的请求,如果用户的请求中包含cookie,则CAS会以此cookie值为key查询缓存中有无TGT,如果存在TGT,则用此TGT签发一个ST,返回给用户。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。
PGT(Proxy Granting Ticket)
Proxy Service的代理凭据。用户通过CAS成功登录某一Proxy Service后,CAS生成一个PGT对象,缓存在CAS本地,同时将PGT的值(一个UUID字符串)回传给Proxy Service,并保存在Proxy Service里。Proxy Service拿到PGT后,就可以为Target Service(back-end service)做代理,为其申请PT。
PGTIOU(Proxy Granting Ticket IOU)
PGTIOU是CAS协议中定义的一种附加票据,它增强了传输、获取PGT的安全性。
PGT的传输与获取的过程:Proxy Service调用CAS的serviceValidate接口验证ST成功后,CAS首先会访问pgtUrl指向的https url,将生成的 PGT及PGTIOU传输给proxy service,proxy service会以PGTIOU为key,PGT为value,将其存储在Map中;然后CAS会生成验证ST成功的xml消息,返回给Proxy Service,xml消息中含有PGTIOU,proxy service收到Xml消息后,会从中解析出PGTIOU的值,然后以其为key,在map中找出PGT的值,赋值给代表用户信息的Assertion对象的pgtId,同时在map中将其删除。
PT(Proxy Ticket)
PT是用户访问Target Service(back-end service)的票据。如果用户访问的是一个Web应用,则Web应用会要求浏览器提供ST,浏览器就会用cookie去CAS获取一个ST,然后就可以访问这个Web应用了。如果用户访问的不是一个Web应用,而是一个C/S结构的应用,因为C/S结构的应用得不到cookie,所以用户不能自己去CAS获取ST,而是通过访问proxy service的接口,凭借proxy service的PGT去获取一个PT,然后才能访问到此应用。
二 代码解析
CAS Ticket类图
TicketGrantingTicket 的 grantServiceTicket方法
方法声明:public synchronized ServiceTicket grantServiceTicket(final String id,final Service service, final ExpirationPolicy expirationPolicy, final boolean credentialsProvided)
方法描述:
1:生成SerivceTicketImpl
2:更新属性:
this.previousLastTimeUsed = this.lastTimeUsed;
this.lastTimeUsed = System.currentTimeMillis();
this.countOfUses++;
3:给service对象的principal属性赋值
4:将service对象放入map services
ServiceTicket 的 grantTicketGrantingTicket方法
方法声明:
public TicketGrantingTicket grantTicketGrantingTicket(final String id, final Authentication authentication,final ExpirationPolicy expirationPolicy)
方法描述:在CAS3.3对CAS2.0协议的实现中,PGT是由ST签发的,调用的就是ServiceTicket的grantTicketGrantingTicket方法。方法返回的TicketGrantingTicket对象,表征的是一个PGT对象,其中的ticketGrantingTicket属性的值是签发ST的TGT对象。
TicketGrantingTicket 的 expire方法
方法声明:void expire()
方法描述:
在CAS的logout接口实现中,要调用TGT对象的expire方法,然后会在缓存中清除此TGT对象。
expire方法的内容:循环遍历 services 中的Service对象,调用其logoutOfService方法。具体Service实现类中的logoutOfService方法的实现,要通知具体的应用,客户要退出。
三、TGT、ST、PGT、PT关系
1:ST是TGT签发的。用户在CAS上认证成功后,CAS生成TGT,用TGT签发一个ST,ST的ticketGrantingTicket属性值是TGT对象,然后把ST的值redirect到客户应用。
2:PGT是ST签发的。用户凭借ST去访问Proxy service,Proxy service去CAS验证ST(同时传递PgtUrl参数给CAS),如果ST验证成功,则CAS用ST签发一个PGT,PGT对象里的ticketGrantingTicket是签发ST的TGT对象。
3:PT是PGT签发的。Proxy service代理back-end service去CAS获取PT的时候,CAS根据传来的pgt参数,获取到PGT对象,然后调用其grantServiceTicket方法,生成一个PT对象。
TGT、ST、PGT、PT之间的关联关系
CAS CLIENT篇
CASFilter 参数说明:
参数
是否必须
说明
com.olymtech.cas.client.filter.loginUrl
是
指定 CAS 提供登录页面的 URL
com.olymtech.cas.client.filter.validateUrl
是
指定 CAS 提供 service ticket 或 proxy ticket 验证服务的 URL
com.olymtech.cas.client.filter.serverName
是
指定客户端的域名和端口,是指客户端应用所在机器而不是 CAS Server 所在机器,该参数或 serviceUrl 至少有一个必须指定
com.olymtech.cas.client.filter.serviceUrl
否
该参数指定过后将覆盖 serverName 参数,成为登录成功过后重定向的目的地址
com.olymtech.cas.client.filter.wrapRequest
否
如果指定为 true,那么 CASFilter 将重新包装 HttpRequest,并且使 getRemoteUser() 方法返回当前登录用户的用户名
com.olymtech.cas.client.filter.noFilter
否
设置不过滤的路径,语法如下:/name1/,/name2,
com.olymtech.cas.client.filter.proxyCallbackUrl
否
用于当前应用需要作为其他服务的代理(proxy)时获取 Proxy Granting Ticket 的地址
com.olymtech.cas.client.filter.authorizedProxy
否
用于允许当前应用从代理处获取 proxy tickets,该参数接受以空格分隔开的多个 proxy URLs,但实际使用只需要一个成功即可。当指定该参数过后,需要修改 validateUrl 到 proxyValidate,而不再是 serviceValidate
com.olymtech.cas.client.filter.renew
否
如果指定为 true,那么受保护的资源每次被访问时均要求用户重新进行验证,而不管之前是否已经通过
com.olymtech.cas.client.filter.gateway
否
指定 gateway 属性
应用整合篇
一、JAVA程序整合
1、 应用配置说明(结合cas client)
导入key到本地jdk(tomcat使用的jdk必须)
keytool -import -keystore d:/work/jdk1.6.0_13/jre/lib/security/cacerts -file d:/casex/800jit.crt -alias 800jit
在ie中导入证书800jit.crt
修改web程序的web.xml添加
<!-- 用于单点退出 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<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 Filter</filter-name>
<filter-class>com.olymtech.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>com.olymtech.cas.client.filter.loginUrl</param-name>
<param-value>https://cas.server.com/cas/login</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.validateUrl</param-name>
<param-value>https://cas.server.com/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.serverName</param-name>
<param-value>saas.server.com</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.wrapRequest</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在jsp/servlet中得到登陆数据:
<%@ page language="java" import="com.olymtech.cas.client.filter.CASFilterRequestWrapper"%>
<%
CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request);
String username = reqWrapper.getRemoteUser();
%>
二、.NET程序整合
附件
ssl.rar(证书)
http.conf(apache配置文件)
httpd-ssl.conf(apache配置文件)
httpd-vhosts.conf(apache配置文件)
server.xml(tomcat配置文件)
AppSsoDemo-java.rar(java整合例子,包含所需jar包)
环境篇
一、所需软件
Jdk:jdk1.6.0_13
Apache:httpd-2.2.15-win32-x86-openssl-0.9.8m-r2
Tomcat:apache-tomcat-6.0.10
jks2pfx:证书导出工具
memcache:memcached-1.2.1-win32(需要memcache集群环境)
二、安全证书生成
1、keytool
Apache、tomcat、jdk需要使用安全证书,进windows command窗口生成证书,命令如下:
--生成证书库
keytool -genkey -alias 800jit -keyalg RSA -keystore d:/cert/800jitkey
--从证书库中到处证书
keytool -export -file d:/cert/800jit.crt -alias 800jit -keystore d:/cert/800jitkey
--把证书导入jdk的证书库
keytool -import -keystore d: /jdk1.6.0_13/jre/lib/security/cacerts -file d:/cert/800jit.crt -alias 800jit
--生成Apache服务器的SSL连接需要配置私钥文件和证书文件
D:\casex\jks2pfx>JKS2PFX.bat .keystore 800jitkey tomcat server_dev00
生成的server_dev00.crt,server_dev00.key放到D:/work/Apache2.2/conf/
2、openssl
openssl req -config ..\conf\openssl.cnf -new -out olymtech.csr
openssl rsa -in privkey.pem -out olymtech.key
openssl x509 -in olymtech.csr -out olymtech.cert -req -signkey olymtech.key -days 3650
openssl x509 -in olymtech.cert -out olymtech.der.crt -outform DER
keytool -import -keystore d:/work/jdk1.6.0_13/jre/lib/security/cacerts -file d:/casex/ssl/olymtech.crt -alias olymtech
keytool -import -keystore D:/casex/800jitkey -file D:/casex/cas-doc/ssl/olymtech.crt -alias olymtech
三、Apache配置
Apache+ssl+虚拟机
--修改http.conf文件
取消注释 LoadModule ssl_module modules/mod_ssl.so
取消注释 Include conf/extra/httpd-ssl.conf
取消注释 Include conf/extra/httpd-vhosts.conf
ProxyPass /cas balancer://cas lbmethod=bytraffic stickysession=jsessionid
<proxy balancer://cas/>
BalancerMember ajp://192.168.1.190:10009/cas loadfactor=1 route=jvm1
BalancerMember ajp://192.168.1.190:8009/cas loadfactor=1 route=jvm2
</proxy>
--修改httpd-ssl.conf
在<VirtualHost _default_:443>下增加
ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid
ProxyPassReverse /cas balancer://cas/
SSLProxyEngine On
修改
SSLCertificateFile "D:/work/Apache2.2/conf/server_dev00.crt"
SSLCertificateKeyFile "D:/work/Apache2.2/conf/server_dev00.key"
--修改httpd-vhosts.conf
在<VirtualHost *:80>下增加
ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid
ProxyPassReverse /cas balancer://cas/
四、Tomcat配置
修改server.xml
--配置ssl
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="d:/work/apache-tomcat-6.0.10/conf/800jitkey"
keystorePass="111111" />
五、session共享(Tomcat)
六、memcache集群
CAS SERVER篇
一、CAS 原理介绍
访问流程图
主要原理:用户第一次访问一个CAS 服务的客户web 应用时(访问URL : ),部署在客户web 应用的cas AuthenticationFilter ,会截获此请求,生成service 参数,然后redirect 到CAS 服务的login 接口,url为 ,认证成功后,CAS 服务器会生成认证cookie ,写入浏览器,同时将cookie 缓存到服务器本地,CAS 服务器还会根据service 参数生成ticket,ticket 会保存到服务器,也会加在url 后面,然后将请求redirect 回客户web 应用,url 为 。这时客户端的AuthenticationFilter 看到ticket 参数后,会跳过,由其后面的TicketValidationFilter 处理,TicketValidationFilter 会利用httpclient 工具访问cas 服务的/serviceValidate 接口, 将ticket 、service 都传到此接口,由此接口验证ticket 的有效性,TicketValidationFilter 如果得到验证成功的消息,就会把用户信息写入web 应用的session里。至此为止,SSO 会话就建立起来了,以后用户在同一浏览器里访问此web 应用时,AuthenticationFilter 会在session 里读取到用户信息,所以就不会去CAS 认证,如果在此浏览器里访问别的web 应用时,AuthenticationFilter 在session 里读取不到用户信息,会去CAS 的login 接口认证,但这时CAS 会读取到浏览器传来的cookie ,所以CAS 不会要求用户去登录页面登录,只是会根据service 参数生成一个ticket ,然后再和web 应用做一个验证ticket 的交互。
二、CAS 服务端的处理逻辑
CAS 服务端总共对外定义了9 个接口,客户端通过访问这9 个接口与服务端交互,这9个接口为:
接口
说明
备注
/login
认证接口
/logout
退出接口,负责销毁认证cookie
/validate
验证ticket 用的接口,CAS1.0 定义
/serviceValidate
验证ticket 用的接口,CAS2.0 定义,返回xml 格式的数据
/proxy
支持代理认证功能的接口
/proxyValidate
支持代理认证功能的接口
/CentralAuthenticationService
用于和远程的web services 交互
/remoteLogin(新增)
认证接口
/directLogin(新增)
认证接口
详细说明:
/login:
登录流程这部分要考虑到不同种类用户凭证的获取方案,以及客户应用传来的service 、gateway 、renew 参数的不同取值组合,CAS 为了实现流程的高度可配置性,采用了Spring Web Flow 技术。通过CAS 发布包里的login-webflow.xml 、cas-servlet.xml 、applicationContext.xml 这3 个文件,找出 了登录有关的所有组件,画出处理流程图。
CAS 默认的登录处理流程
第一次访问Web 应用的流程走向
已经登录web1 后,访问web1 的资源(web1 没有启动session ),或访问web2 的资源
注:
1 : InitialFlowSetupAction: 是流程的入口。用 request.getContextPath() 的值来设置 cookie 的 Path 值, Cookie 的 path 值是在配置文件里定义的,但这个 Action 负责将 request.getContextPath() 的值设置为 Cookie 的 path 值,这是在 cas 部署环境改变的情况下,灵活地设置 cookie path 的方式;把 cookie 的值以及 service 参数的值放入 requestContext 的 flowscope 里。
2 : GenerateServiceTicketAction 此 Action 负责根据 service 、 GTC cookie 值生成 ServiceTicket 对象, ServiceTicket 的 ID 就是返回给客户应用的 ticket 参数,如果成功创建 ServiceTicket ,则转发到 WarnAction ,如果创建失败,且 gateway 参数为 true ,则直接redirect 到客户应用, 否则则需要重新认证。
3 : viewLoginForm 这是登录页面, CAS 在此收集用户凭证。 CAS 提供的默认实现是 /WEB-INF/view/jsp/simple/ui/casLoginView.jsp 。
4 : bindAndValidate 对应 AuthenticationViaFormAction 的 doBind 方法,该方法负责搜集登录页面上用户录入的凭证信息(用户名、密码等),然后把这些信息封装到 CAS 内部的 Credentials 对象中。用户在 casLoginView.jsp 页面上点击提交后,会触发此方法。
5:submit 对应 AuthenticationViaFormAction 的 submit 方法 , 如果 doBind 方法成功执行完, 则触发 submit 方法,此方法负责调用centralAuthenticationService 的 grantServiceTicket 方法,完成认证工作,如果认证成功,则生成 TicketGrantingTicket 对象,放在缓存里, TicketGrantingTicket 的 ID 就是 TGC Cookie 的 value 值。
6 : warn CAS 提供了一个功能:用户在一个 web 应用中跳到另一个 web 应用时, CAS 可以跳转到一个提示页面,该页面提示用户要离开一个应用进入另一个应用,可以让用户自己选择。用户在登录页面 viewLoginForm 上选中了 id=”warn” 的复选框,才能开启这个功能。
WarnAction 就检查用户有没有开启这个功能,如果开启了,则转发到showWarnView, 如果没开启,则直接redirect 到客户应用。
7 :SendTicketGrantingTicketAction 此Action 负责为response 生成TGC Cookie ,cookie 的值就是 AuthenticationViaFormAction 的submit 方法生成的 TicketGrantingTicket 对象的 ID 。
8 : viewGenerateLoginSuccess 这是 CAS 的认证成功页面。
/logout: ( 对应实现类 org.jasig.cas.web.LogoutController )
处理逻辑:
1) removeCookie
2) 在服务端删除TicketGrantingTicket 对象(此对象封装了cookie 的value 值)
3 )redirect 到退出页面,有2 种选择:
if(LogoutController 的followServiceRedirects 属性为true 值,且url 里的service 参数非空){
redirect 到 sevice 参数标识的url
}
else{
redirect 到内置的casLogoutView (cas/WEB-INF/view/jsp/default/ui/casLogoutView.jsp ),如果url 里有url 参数,则此url 参数标识的链接会显示在casLogoutView 页面上。
}
/serviceValidate: (对应实现类 org.jasig.cas.web.ServiceValidateController )
处理逻辑:
如果service 参数为空或ticket 参数为空,则转发到failureView (/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationFailure.jsp )
验证ticket 。以ticket 为参数,去缓存里找ServiceTicketImpl 对象,如果能找到,且没有过期,且ServiceTicketImpl 对象对应的service 属性和service 参数对应,则验证通过,验证通过后,请求转发至casServiceSuccessView (cas/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationSuccess.jsp ),验证不通过,则转发到failureView 。
三、认证相关的概念及流程
概念
Credentials 用户提供的用于登录用的凭据信息,如用户名/ 密码、证书、IP 地址、Cookie 值等。比如 UsernamePasswordCredentials ,封装的是用户名和密码。CAS 进行认证的第一步,就是把从UI 或request 对象里取到的用户凭据封装成Credentials 对象,然后交给认证管理器去认证。
AuthenticationHandler 认证Handler, 每种AuthenticationHandler 只能处理一种Credentials ,如AbstractUsernamePasswordAuthenticationHandler 只负责处理 U sernamePasswordCredentials 。
Principal 封装用户标识,比如 SimplePrincipal, 只是封装了用户名。认证成功后, credentialsToPrincipalResolvers 负责由Credentials 生成 Principal 对象。
CredentialsToPrincipalResolvers 负责由 Credentials 生成 Principal 对象,每种 CredentialsToPrincipalResolvers 只处理 一种Credentials ,比如 UsernamePasswordCredentialsToPrincipalResolver 负责从 U sernamePasswordCredentials 中取出用户名,然后将其赋给生成的 SimplePrincipal 的 ID 属性。
AuthenticationMetaDataPopulators 负责将 Credentials 的一些属性赋值给 Authentication 的 attributes 属性。
Authentication Authentication是认证管理器的最终处理结果, Authentication 封装了 Principal ,认证时间,及其他一些属性(可能来自 Credentials )。
AuthenticationManager 认证管理器得到 Credentials 对象后,负责调度AuthenticationHandler 去完成认证工作,最后返回的结果是 Authentication 对象。
CentralAuthenticationService CAS 的服务类,对 Web 层提供了一些方法。该类还负责调用 AuthenticationManager 完成认证逻辑。
序列图
类图
四、
CAS的核心就是其Ticket,及其在Ticket之上的一系列处理操作。CAS的主要票据有TGT、ST、PGT、PGTIOU、PT,其中TGT、ST是CAS1.0协议中就有的票据,PGT、PGTIOU、PT是CAS2.0协议中有的票据。
一 名词解释
TGT(Ticket Grangting Ticket)
TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后,CAS生成cookie,写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。
ST(Service Ticket)
ST是CAS为用户签发的访问某一service的票据。用户访问service时,service发现用户没有ST,则要求用户去CAS获取ST。用户向CAS发出获取ST的请求,如果用户的请求中包含cookie,则CAS会以此cookie值为key查询缓存中有无TGT,如果存在TGT,则用此TGT签发一个ST,返回给用户。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。
PGT(Proxy Granting Ticket)
Proxy Service的代理凭据。用户通过CAS成功登录某一Proxy Service后,CAS生成一个PGT对象,缓存在CAS本地,同时将PGT的值(一个UUID字符串)回传给Proxy Service,并保存在Proxy Service里。Proxy Service拿到PGT后,就可以为Target Service(back-end service)做代理,为其申请PT。
PGTIOU(Proxy Granting Ticket IOU)
PGTIOU是CAS协议中定义的一种附加票据,它增强了传输、获取PGT的安全性。
PGT的传输与获取的过程:Proxy Service调用CAS的serviceValidate接口验证ST成功后,CAS首先会访问pgtUrl指向的https url,将生成的 PGT及PGTIOU传输给proxy service,proxy service会以PGTIOU为key,PGT为value,将其存储在Map中;然后CAS会生成验证ST成功的xml消息,返回给Proxy Service,xml消息中含有PGTIOU,proxy service收到Xml消息后,会从中解析出PGTIOU的值,然后以其为key,在map中找出PGT的值,赋值给代表用户信息的Assertion对象的pgtId,同时在map中将其删除。
PT(Proxy Ticket)
PT是用户访问Target Service(back-end service)的票据。如果用户访问的是一个Web应用,则Web应用会要求浏览器提供ST,浏览器就会用cookie去CAS获取一个ST,然后就可以访问这个Web应用了。如果用户访问的不是一个Web应用,而是一个C/S结构的应用,因为C/S结构的应用得不到cookie,所以用户不能自己去CAS获取ST,而是通过访问proxy service的接口,凭借proxy service的PGT去获取一个PT,然后才能访问到此应用。
二 代码解析
CAS Ticket类图
TicketGrantingTicket 的 grantServiceTicket方法
方法声明:public synchronized ServiceTicket grantServiceTicket(final String id,final Service service, final ExpirationPolicy expirationPolicy, final boolean credentialsProvided)
方法描述:
1:生成SerivceTicketImpl
2:更新属性:
this.previousLastTimeUsed = this.lastTimeUsed;
this.lastTimeUsed = System.currentTimeMillis();
this.countOfUses++;
3:给service对象的principal属性赋值
4:将service对象放入map services
ServiceTicket 的 grantTicketGrantingTicket方法
方法声明:
public TicketGrantingTicket grantTicketGrantingTicket(final String id, final Authentication authentication,final ExpirationPolicy expirationPolicy)
方法描述:在CAS3.3对CAS2.0协议的实现中,PGT是由ST签发的,调用的就是ServiceTicket的grantTicketGrantingTicket方法。方法返回的TicketGrantingTicket对象,表征的是一个PGT对象,其中的ticketGrantingTicket属性的值是签发ST的TGT对象。
TicketGrantingTicket 的 expire方法
方法声明:void expire()
方法描述:
在CAS的logout接口实现中,要调用TGT对象的expire方法,然后会在缓存中清除此TGT对象。
expire方法的内容:循环遍历 services 中的Service对象,调用其logoutOfService方法。具体Service实现类中的logoutOfService方法的实现,要通知具体的应用,客户要退出。
三、TGT、ST、PGT、PT关系
1:ST是TGT签发的。用户在CAS上认证成功后,CAS生成TGT,用TGT签发一个ST,ST的ticketGrantingTicket属性值是TGT对象,然后把ST的值redirect到客户应用。
2:PGT是ST签发的。用户凭借ST去访问Proxy service,Proxy service去CAS验证ST(同时传递PgtUrl参数给CAS),如果ST验证成功,则CAS用ST签发一个PGT,PGT对象里的ticketGrantingTicket是签发ST的TGT对象。
3:PT是PGT签发的。Proxy service代理back-end service去CAS获取PT的时候,CAS根据传来的pgt参数,获取到PGT对象,然后调用其grantServiceTicket方法,生成一个PT对象。
TGT、ST、PGT、PT之间的关联关系
CAS CLIENT篇
CASFilter 参数说明:
参数
是否必须
说明
com.olymtech.cas.client.filter.loginUrl
是
指定 CAS 提供登录页面的 URL
com.olymtech.cas.client.filter.validateUrl
是
指定 CAS 提供 service ticket 或 proxy ticket 验证服务的 URL
com.olymtech.cas.client.filter.serverName
是
指定客户端的域名和端口,是指客户端应用所在机器而不是 CAS Server 所在机器,该参数或 serviceUrl 至少有一个必须指定
com.olymtech.cas.client.filter.serviceUrl
否
该参数指定过后将覆盖 serverName 参数,成为登录成功过后重定向的目的地址
com.olymtech.cas.client.filter.wrapRequest
否
如果指定为 true,那么 CASFilter 将重新包装 HttpRequest,并且使 getRemoteUser() 方法返回当前登录用户的用户名
com.olymtech.cas.client.filter.noFilter
否
设置不过滤的路径,语法如下:/name1/,/name2,
com.olymtech.cas.client.filter.proxyCallbackUrl
否
用于当前应用需要作为其他服务的代理(proxy)时获取 Proxy Granting Ticket 的地址
com.olymtech.cas.client.filter.authorizedProxy
否
用于允许当前应用从代理处获取 proxy tickets,该参数接受以空格分隔开的多个 proxy URLs,但实际使用只需要一个成功即可。当指定该参数过后,需要修改 validateUrl 到 proxyValidate,而不再是 serviceValidate
com.olymtech.cas.client.filter.renew
否
如果指定为 true,那么受保护的资源每次被访问时均要求用户重新进行验证,而不管之前是否已经通过
com.olymtech.cas.client.filter.gateway
否
指定 gateway 属性
应用整合篇
一、JAVA程序整合
1、 应用配置说明(结合cas client)
导入key到本地jdk(tomcat使用的jdk必须)
keytool -import -keystore d:/work/jdk1.6.0_13/jre/lib/security/cacerts -file d:/casex/800jit.crt -alias 800jit
在ie中导入证书800jit.crt
修改web程序的web.xml添加
<!-- 用于单点退出 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<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 Filter</filter-name>
<filter-class>com.olymtech.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>com.olymtech.cas.client.filter.loginUrl</param-name>
<param-value>https://cas.server.com/cas/login</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.validateUrl</param-name>
<param-value>https://cas.server.com/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.serverName</param-name>
<param-value>saas.server.com</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.wrapRequest</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在jsp/servlet中得到登陆数据:
<%@ page language="java" import="com.olymtech.cas.client.filter.CASFilterRequestWrapper"%>
<%
CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request);
String username = reqWrapper.getRemoteUser();
%>
二、.NET程序整合
附件
ssl.rar(证书)
http.conf(apache配置文件)
httpd-ssl.conf(apache配置文件)
httpd-vhosts.conf(apache配置文件)
server.xml(tomcat配置文件)
AppSsoDemo-java.rar(java整合例子,包含所需jar包)
发表评论
-
sso 之 搜狐单点登陆实现方案
2013-09-11 23:42 1487http://blog.chinaunix.net/uid-2 ... -
淘宝如何跨域获取 Cookie 分析
2013-08-24 11:36 1205淘宝如何跨域获取 Cookie 分析 http://denge ... -
sso 入门
2013-07-08 00:53 916http://www.cnblogs.com/kingcucu ... -
SSO(单点登录)实现机制讲解
2013-07-08 00:49 1481http://blog.csdn.net/yan_dk/art ... -
sso 之 CAS 之 跨域 Ajax 登录实践
2013-07-07 02:01 0http://www.iteye.com/topic/1111 ... -
sso 之 新浪微博如何实现 SSO
2013-07-07 02:00 0http://www.iteye.com/topic/1039 ... -
sso 之 用CAS实现SSO----简单tomcat实例配置
2013-07-07 01:46 0http://mljavalife.iteye.com/blo ... -
SSO 之 (单点登录)实施中遇到的几个问题
2013-07-07 01:45 24974http://blog.csdn.net/yan_dk/art ... -
sso 之 详细设计说明书(下篇)
2013-07-07 01:41 1487http://cailin.iteye.com/blog/14 ... -
SSO单点登录解决方案
2013-07-07 01:01 1165http://www.blogjava.net/Jack200 ... -
java单点登录_设计一
2012-10-31 22:56 1017http://www.blogjava.net/ ...
相关推荐
很抱歉,但根据您给出的信息,标题、描述和标签中包含的"ss52ss"字符串并不能直接对应到具体的IT知识点。压缩包子文件的名称也是"ss52ss",同样没有提供足够的信息来生成相关的IT知识内容。为了提供一篇详细且丰富的...
srwx------ 1 root root 0 May 16 09:21 stream-unix.2550.0= drwxrwxrwt 2 root root 4096 May 16 09:22 X11-unix/ ``` **3. VMware虚拟机格式转化** - **查看文件信息**: ```bash root@CVK2:/vms/images# ...
在IT领域,尤其是在苹果Mac系统与Windows系统的共存或者自定义安装过程中,"boot0ss错误"是一个常见的问题。这个错误通常发生在尝试使用Clover引导器启动非原生Apple硬件时,比如在装有Windows或其他操作系统分区的...
Asterisk的强大之处在于其高度可扩展性和灵活性,可以支持多种协议和信令方式,其中就包括SS7(Signaling System No. 7)信令。本文将深入探讨标题为"chan_ss7-1.0.0.tar.gz"的Asterisk SS7通道处理模块——chan_ss7...
标题“ss2005_0ss2005_0”和描述中的重复字符串“ss2005_0ss2005_0…”并没有提供直接的IT知识点,但我们可以根据提供的标签“ss2005_0”以及压缩包内的文件名来推测可能涉及的内容。 标签“ss2005_0”可能是某种...
在本压缩包文件中,"SS7.rar_protocols ss7_ss7_ss7 协议_七号信令"显然包含了关于SS7协议的详细资料,对于那些正在开发或研究SS7技术的人来说,是非常宝贵的学习资源。 SS7协议的核心是消息传递部分(MTP),它...
CAS(Central Authentication Service)是耶鲁大学开发的一个开源项目,它提供了一种集中式的身份验证服务,使得用户只需在一个地方登录,就能访问到所有的受保护资源,极大地提高了用户体验和安全性。 在这个"单点...
SS7804和SS7810是日本岩崎电器株式会社生产的模拟双踪示波器系列中的两个型号,它们具备40MHz的带宽,支持CRT读出功能,能够方便、准确地测量电压幅度、频率、相位和时间间隔等参数。在介绍具体使用方法前,我们需要...
Linux命令之ssserver命令详解
Yale CAS(Central Authentication Service)是由耶鲁大学开发的一个开源项目,专门用于实现SSO功能。它是一个平台无关的解决方案,易于理解和部署,并且支持代理功能,这意味着它可以与各种不同的应用程序和服务...
《Multisim10国产三极管数据库:深入解析SS8050、SS8550及SS9012-SS9015》 Multisim是一款广泛应用于电子设计自动化领域的仿真软件,其丰富的元件库是工程师进行电路设计和分析的重要工具。在给定的"Multisim10国产...
蓝光 3D 文件格式(SSIF)介绍 蓝光 3D 文件格式(SSIF)是蓝光立体播放机蓝光原盘文件构成的一种 Stereoscopic Interleaved 文件,由两个 BDAV MPEG-2 传输流构成。BDAV MPEG-2 传输流中包含一个用于左眼或右眼的 ...
在"ss0-shiro-cas-master"这个压缩包中,包含了实现上述功能的源代码和配置文件。通过分析和学习这些代码,我们可以了解如何在实际项目中配置和使用Shiro+CAS实现单点登录。这不仅有助于提升我们的安全知识,还能...
【软交换控制设备SS介绍】 软交换控制设备SS,全称为Soft Switch,是现代通信网络中的核心组件,尤其在下一代网络(NGN)架构中扮演着至关重要的角色。ZTE的SS系列,如SS1A和SS1B,是专为实现高效、灵活的语音和数据...
《读秀SS转KID工具SS2KID》是一款专为超星、读秀平台用户设计的实用软件,主要用于实现SS号(超星图书唯一标识)与KID号(Kindle电子书唯一标识)之间的相互转换。这款工具的出现极大地便利了用户在不同平台之间共享...
oracle日期格式和java日期格式区别 HH24:mm:ss和HH24:mi:ss的区别 1.java 1)分钟用mm表示 24小时制: java(区分大小写):yyyy-MM-dd HH:mm:ss 12小时制: java(区分大小写):yyyy-MM-dd hh:mm:ss 2)...
ss8050 spice model 模型,欢迎使用ss8050 spice model 模型,欢迎使用ss8050 spice model 模型,欢迎使用
multisim11.0---tools---database---database manager---compoennts---database:user database ---inport,打开模型文件---OK
- **逆变器**:对于需要将直流电转换为交流电的应用,SS310也是理想的选择之一。 - **汽车电子**:在汽车行业中,由于SS310能够承受高温焊接,因此在汽车电子设备中也有广泛应用。 - **消费电子**:在许多消费电子...