项目中用到了springSecurity作为认证,并且要对接sso单点登录,因为是微服务,还需要在微服务的uaa中进行认证。当前的方式是网关gate中集成cas的springsecurity包,然后sso认证登录成功后在去uaa认证获取token,通过重定向返回前端token。
存在的问题是,当各个系统使用同一个网关,因为重定向地址是写死在配置文件中,重定向就存在问题。
通过跟踪代码,当访问cas的登录拦截/login/cas?redirectUrl=http://localhost:8089 (注意:此处的参数名称不能是service,否则重定向会出现问题,servcie是cas的一个参数的关键词)的时候,刚进去的时候在
RememberWebAuthenticationDetails类中能够获取到重定向参数,但是后续cas的代码会重定向到sso进行认证,并且返回ticket,此时又进入了上述方法,因为请求是不同的,所以session,进程都是不同的。将之前redirectUrl覆盖了。并且也没有一个唯一的key值能够保存重定向url,以方便在处理成功后获取重定向url。
最后在同事的帮助下,找到了方法,是采用HttpSessionRequestCache的方式保存住跳转前的request请求,然后在处理成功重定向的地方通过session获取SPRING_SECURITY_SAVED_REQUEST的值。该值就是跳转前的request请求。
代码实现如下:
保存requestCache: