cas-client ajax跨域,springboot cas二次认证、session失效与ajax跨域

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 {

@Resource

IUserService userService;

@Override

public UserDetails loadUserDetails(CasAssertionAuthenticationToken token) throws UsernameNotFoundException {

//todo

}

}

整个过程时序如下:

890bdff90e3c

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值