springboot cas client接入问题记录。
1.二次认证
由Springboot cas单点登录流程知道,用户信息是在app从cas server校验ticket后获得的,那么用户信息二次校验应该在这之后。cas的用户登录验证是在CasAuthenticationFilter中完成的,其中验证方法为:
@Override
public Authentication attemptAuthentication(final HttpServletRequest request,
final HttpServletResponse response) throws AuthenticationException,
IOException {
// if the request is a proxy request process it and return null to indicate the
// request has been processed
if (proxyReceptorRequest(request)) {
logger.debug("Responding to proxy receptor request");
CommonUtils.readAndRespondToProxyReceptorRequest(request, response,
this.proxyGrantingTicketStorage);
return null;
}
final boolean serviceTicketRequest = serviceTicketRequest(request, response);
final String username = serviceTicketRequest ? CAS_STATEFUL_IDENTIFIER
: CAS_STATELESS_IDENTIFIER;
String password = obtainArtifact(request);
if (password == null) {
logger.debug("Failed to obtain an artifact (cas ticket)");
password = "";
}
final UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
username, password);
authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
return this.getAuthenticationManager().authenticate(authRequest);
}
可以知道验证是由AuthenticationManager成员实现的。debug可以知道AuthenticationManager是由WebSecurityConfigurerAdapter内的AuthenticationManagerBuilder生成的,其内部由ProviderManager包装了AuthenticationProvider,AuthenticationProvider来自于authenticationProvider方法的传入。所以需要重写WebSecurityConfigurerAdapter的void configure(AuthenticationManagerBuilder auth),在AuthenticationManagerBuilder中传入CasAuthenticationProvider:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
super.configure(auth);
auth.authenticationProvider(casAuthenticationProvider());
}
而具体的处理由CasAuthenticationProvider内部AuthenticationUserDetailsService完成,所以传入的CasAuthenticationProvider需要添加AuthenticationUserDetailsService接口自定义实现,用户信息会在AuthenticationUserDetailsService接口的loadUserDetails方法中返回:
public class MyCasUserDetailService implements AuthenticationUserDetailsService<CasAssertionAuthenticationToken> {
@Resource
IUserService userService;
@Override
public UserDetails loadUserDetails(CasAssertionAuthenticationToken token) throws UsernameNotFoundException {
//todo
}
}
整个过程时序如下:

2.session失效
由于cas server配置的token的有效时间可能与app配置的session有效时间不一致,可能会出现下面两种情况:
- app session失效时,cas server token还没有失效:此时,会重定向到cas server单点登录页面,但不用重新登录,可自完成登录认证。
- app session还没失效,但cas server token已经失效:此时,由于拦截器用户检查不通过,需要重定向到cas server重新登录。
3.ajax跨域
前后端分离时,前端发送到app的ajax请求被cas filter拦截重定向到cas server登陆页时,会产生跨域问题。
处理办法:返回前端特定的错误码和重定向地址,让前端重新定向到cas server进行登录。
网友评论