shrio cas集成之请求流程及阻截特性

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)