美文网首页
springboot cas二次认证、session失效与aja

springboot cas二次认证、session失效与aja

作者: matthewfly | 来源:发表于2021-02-07 09:57 被阅读0次

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
    }
}

整个过程时序如下:


spring cas ticket验证时序图.jpg

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进行登录。

相关文章

网友评论

      本文标题:springboot cas二次认证、session失效与aja

      本文链接:https://www.haomeiwen.com/subject/qmnstktx.html