shrio cas集成之请求流程及阻截特性
shrio cas集成之请求流程及拦截特性:
整理一下整个登录流程(一次登录包含三次请求):
http://localhost:8080/cas/login?a=0&service=http://localhost:8081/web/cas(a=0,cas登录界面的参数,&转义符)
第一次请求应用服务器:用地址配置的cas前部分http://localhost:8080/cas/login
当用户第一次访问应用服务器的URL,由于session中没有"_const_cas_assertion_"且参数中没有ticket(或cookie没有值,cookie有值可以生成session),会被AuthenticationFilter跳转到CAS服务器的登录页面。
第二次请求应用服务器:调用service部分验证TGT,service=http://localhost:8081/web/cas
在CAS服务器的登录页面成功登录以后,会跳转到应用服务器登录前的页面,但是加上了一个参数ticket。此次请求由于有ticket参数,通过了AuthenticationFilter,但是TicketValidationFilter会对ticket进行校验,校验成功后,会在session中加入"_const_cas_assertion_",再去掉ticket参数进行一次跳转。
第三次请求应用服务器:验证通过后去了ticket再正常跳转
此时由于session中已经有了"_const_cas_assertion_",会通过AuthenticationFilter,由于没有ticket参数,也通过了TicketValidationFilter,也就是可以正常显示出这个页面了。以后再请求应用服务器就和这次一样了,由于session包含"_const_cas_assertion_"即可正常访问。
即这三次请求的地址都在登录地址中前部分登录页面,后部分验证TGT,最后一次去了ticket再正常跳转
单纯的cas:
用web.xml中的过滤器实现,他的casServerLoginUrl相当于shrio与之集成(A集成)的前部分cas登录页面请求,
TGT验证是在另一个过滤其中做了不再像A集成一样用要靠后半部分地址手动调用TGT验证,
登录成功回调地址是登陆前请求被过滤拦截要先登录的地址等同A集成显示写的successUrl,当然A集成也有优先
跳到请求时被拦截先登的地址(cas登录成功回调请求页面的特性优先successUrl(直接请求登陆就是用successUrl))
<filter>
<filter-name>CAS Authentication Filter</filter-name>
<filter-class>com.ylsoft.utils.MyCasFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>/login</param-value>
</init-param>
</filter>
<filter>
<filter-name>CAS Authentication Filter1</filter-name>
<filter-class>com.ylsoft.utils.MyCasFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>/login?a=1</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/os/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Authentication Filter1</filter-name>
<url-pattern>/ou/*</url-pattern>
</filter-mapping>
cas写完cookie sesion之后,shrio自己再按常规验证
拦截特性:
只有认证成功之后才会有session信息的写入,没有拦截的地址没有记录session的功能,类似登录拦截这种过滤器的拦截也不会有session的记录
分布式的时候请求哪个服务的地址,就用哪个服务的拦截(拦截url就配置在哪里),不管是否从哪个服务发出的请求,
写拦截地址的特点是不写项目名直接写出去项目名之后的/myaccount/getFirmCenter =csLogin,
这个只看组装之后发出的url不管组装前,比如本系统${content}+"web/myaccount/getFirmCenter",还是其他系统
${content}+"/../web/myaccount/getFirmCenter "(/../为了去了其他系统名)最终的请求地址都是http://localhost:8081/web/myaccount/getFirmCenter
所以:拦截地址就在web项目配/myaccount/getFirmCenter =csLogin,
定点拦截方案等自定义拦截,自定义的拦截优先于在拦截工厂写入的拦截(相同功能的拦截),即同类功能的拦截器虽然地址规则都符合,
如果一个url有多个拦截器(自定义的和默认的)这些中只要有相同功能的比如拦截登录,自定义的优先默认的,只执行一个即可
比如多个自定义登录过滤的配置(默认有一个),在url符合过滤规则的时候,优先用自定义的
对于不需要拦截的,只拎出放行的即可(anoe)