前言:在公司的系统中用到了单点登陆,虽然看懂了代码但是隔几天再看又是一头雾水,所以总结一下。
参考:https://www.cnblogs.com/Eleven-Liu/p/10336181.html(极好)
目录
第五章 UserAdapterFilterRegistration
第一章 单点登陆简析
1.用户请求CAS客服端(服务)
2.CAS客户端检验没登陆,重定向用户请求到,CAS服务器
3.CAS服务器返回给用户登陆界面,用户在登陆界面进行登陆
4.CAS服务器产生凭证ticket,并重定向用户请求到CAS客户端。
5.CAS接受到请求中的ticket后,发送ticket到CAS服务端进行验证。
6.CAS服务器验证通过,返回用户的用户名到CAS客户端,并在CAS客户端设置session,用户登陆成功。
第二章 系统概要
公司系统中用到的单点登录必选配置主要有三个,通过过滤器进行注册,先后顺序为:
LoginAuthenticationFilter->TicketValidationFilter->UserAdapterFilter
系统会依次经过三个过滤器,LoginAuthenticationFilter、TicketValidationFilter、UserAdapterFilter,然后就可以访问我们需要访问的请求了。
下面是三个过滤器的配置
@Configuration
public class WebSecurityConfigurer {
@Value("${service.domain}")
private String domain;
/**
* 第一步:该过滤器负责用户的认证工作,必须启用它;serverName中填写第三方应用所在服务器的连接地址
* @return
*/
@Bean
public FilterRegistrationBean casFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new LoginAuthenticationFilter());
registration.addInitParameter("casServerLoginUrl","https://sso.xxxx.com/cas/login");
registration.addInitParameter("serverName",domain);
registration.addUrlPatterns("/*");//
return registration;
}
/**
* 该过滤器负责对Ticket的校验工作,必须启用它;serverName中填写第三方应用所在服务器的连接地址
* @return
*/
@Bean
public FilterRegistrationBean casValidationFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new TicketValidationFilter());
registration.addInitParameter("casServerUrlPrefix","https://sso.xxxx.com/cas");
registration.addInitParameter("serverName",domain);
registration.addUrlPatterns("/*");
return registration;
}
/**
* 初始化cookie
* @return
*/
@Bean
public FilterRegistrationBean UserAdapterFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new UserAdapterFilter());
registration.addUrlPatterns("/*");
return registration;
}
}
第三章 LoginAuthenticationFilter
现在开始看第一个过滤器LoginAuthenticationFilter。
如果我们的请求是以apis打头的,表明不需要经过权限校验可以直接放行到下一个过滤器。
如果不是以apis打头的则在request中查找用户的邮箱(即用户名),先从cookie中进行检索,再从session中进行检索(代码2)