CAS实现SSO全流程教程–基本原理和服务端配置(CAS集成JDBC,LDAP)
一.概念:
1.什么是SSO
单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。
例如:阿里系的系统,天猫,淘宝
2.SSO相关产品
SSO是一个理论,相当于java中的接口,接口就要有实现类,流行的SSO产品有OAuth2.0、CAS,OPENID、LDAP等。本教程对CAS进行讲解
2.1 OAuth 2.0
OAuth 2.0是一个关于授权的开放网络协议,它允许用户让第三方网站访问该用户在某一网站上存储的信息和资源,如账户信息,照片,联系人等,而不需要给第三方网站提供某一网站上的账户和密码。
OAuth授权流程如下所述:
1、用户打开客户端,客户端要求授权。
2、用户同意客户端授权。
3、客户端使用上一步提供的授权,向服务器授权层申请令牌。
4、授权服务器对客户端进行认证后,同意发放令牌。
5、客户端使用令牌,向资源服务器申请资源。
6、资源服务器确认令牌,向客户端开放资源。
例如,访问网站可以使用QQ、微信快捷登录。
2.2 LDAP
LDAP是一种基于轻量目录访问协议,全称是Lightweight Directory Access Protocol,是由一个为查询、浏览和搜索而优化的数据库构成,它成树状结构组织数据,类似文件目录一样。
LDAP单点登录认证主要是改变原有的认证策略,使得需要的软件都通过LDAP服务器进行认证,在统一身份认证后,用户的所有信息都存储在AD Server中,终端用户在需要使用公司内部服务的时候,都需要通过AD服务器进行认证。
整个LDAP登录流程由以下4个步骤组成:
1、连接到LDAP服务器。
2、绑定到LDAP服务器。
3、在LDAP服务器上执行所需要的操作。
4、释放LDAP服务器的连接。
LDAP主要用于企业内部,相当于LDAP作为一个中央数据库,存储了所有的用户信息,当登录公司系统时,进入LDAP进行用户检验。
2.3 CAS
CAS即Central Authentication Service模型(中央式认证服务),该协议是为应用提供可信身份认证的单点登录系统,最初是由耶鲁大学开发的。CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。
二.CAS资源
1.官网:
https://apereo.github.io/cas
2.github:
https://github.com/apereo/cas
三.CAS原理分析
1.名词解释:
TGC:存在浏览器的cookie中,当登录成功后CAS人中认证服务器创建
TGT:Ticket Granted Ticket,存在CAS认证服务器session中,登录成功后创建,并且在浏览器生成TGC
ST:Ticket Granted Ticket,TGT生成,在url中拼接
2.CAS验证详细流程:
客户端:A:https://clientA.com; B:https://clientB.com
服务端:S:https://server.com;
1.浏览器第一次访问A,被web.xml中的org.jasig.cas.client.authentication.AuthenticationFilter过滤器拦截
2.AuthenticationFilter拦截后,判断session:中有没有_const_cas_assertion_,有就放行,没有再次判断
url中有没有url中有没有ticket,如果有放行,没有302重定向到登录页->https://server.com?service=https://clientA.com
3.跳转到服务器S,S判断没有TGC所以不能获取到TGT,跳转到认证登录页
4.认证页面输入用户名密码提交,S认证(密码策略可以自定义)
5.S认证通过后,生成Session:TGT和ST,并且根据TGT生成Cookie存在浏览器中,返回302重定向到A带上ST(ticket),生成的TGT是认证服务器地址的cookie
6.这时候重定向访问A带上了ticket,AuthenticationFilter拦截发现没有session:const_cas_assertion_但是有了ticket,然后交给TicketValidationFilter过滤器处理,验证ticket是否有效,如果有效,在A的Session中生成_const_cas_assertion,存入用户信息。
7.浏览器第二次访问A,也是被AuthenticationFilter过滤器拦截,判断session中是否有_const_ca