集群环境下存在的问题:
SOA架构下,用户登录时,用户信息存储在session中,但是session域是不能跨服务器的,因此,用户需要多次登录才能完成身份认证,授予权限
解决思想:
单点登录,Single Sign On
在多个应用系统中,配置一个认证服务,只需要登录一次,就可以访问所有互相信任的应用(同一个浏览器下的一次会话)
CAS:
对SSO思想的实现,分为CAS server / CAS Client
CAS Server 需要独立部署,主要负责对用户的认证工作
CAS Client 负责处理对客户端受保护资源的访问请求
Cookie的key: CASTGC (key固定,value不固定) 此处的Cookie的key-value称为CAS Ticket
Cookie的value:CmT2Vn5weUv2BvZK4ShRxyKbQ29mxw6C1MkCyuryU4jlCi5HV7-cas01.example.org
CAS的原理:
1.当浏览器第一次发送请求时,被CAS Client过滤器拦截,CAS Client访问CAS Server
2.CAS Server校验浏览器cookie中ticket信息,(由于第一次访问),校验失败,重定向到登录页面
3.用户点击登录按钮,提交请求到CAS Server,认证成功后,SSO 服务器会产生一个随机的Service Ticket,并将这个cookie信息存储到浏览器中
4.然后重定向到第一次发送的请求的路径,再次被CAS Client拦截,校验,访问成功
注意:
1.从哪里被拦截,认证成功后,就会被重定向回到哪里,比如:
浏览器输入-->http://localhost:9101/index.html--> 被拦截了,重定向到登录页面-->
http://localhost:9100/cas/login?service=http%3A%2F%2Flocalhost%3A9003%2Flogin%2Fcas
-->登录认证成功,会被重定向到最开始访问的URL-->http://localhost:9003/index.html
2.如果退出的时候,指定/logout/cas?service=CAS Client下的资源,这个退出请求一样会被拦截
原生CAS的使用
1.导入依赖
< dependencies>
< dependency>
< groupId> org.jasig.cas.client</ groupId>
< artifactId> cas-client-core</ artifactId>
< version> 3.3.3</ version>
</ dependency>
< dependency>
< groupId> javax.servlet</ groupId>
< artifactId> servlet-api</ artifactId>
< version> 2.5</ version>
< scope> provided</ scope>
</ dependency>
</ dependencies>
2.web.xml中的两个过滤器:
org.jasig.cas.client.authentication.AuthenticationFilter
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
第一个过滤器的功能主要是用于认证的,第二个过滤器的功能主要是用于校验ticket信息
注意: 这两个核心过滤器都需要配置CAS Server和CAS Client的路径,CAS Client路径就是当前工程的访问URL
CAS集成Spring Security
Spring Security的核心功能:
1.登录认证
2.用户授权
CAS的核心功能:
1.登录认证
CAS集成Spring Security相当于Spring Security将登录认证功能交给了CAS来完成,Spring Security的执行顺序是先认证再授权,所以-->CAS-->Spring Security