这篇文章主要介绍“春引导从1。x升级到2。x后单点登陆SSO问题的解决方法”,在日常操作中,相信很多人在春天引导从1。x升级到2。x后单点登陆SSO问题的解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答“春引导从1。x升级到2。x后单点登陆SSO问题的解决方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
解决弹簧引导从1。x升级到2。x后单点登陆(SSO)问题
比;??在学习春云时,遇到了授权服务oauth相关内容时,总是一知半解,因此决定先把Spring Security, Spring Security Oauth3等权限,认证相关的内容,原理及设计学习并整理一遍。本系列文章就是在学习的过程中加强印象和理解所撰写的,如有侵权请告知。
比;项目环境:比;——JDK1.8比;-弹簧引导2。x比;- Spring Security 5. x
? ?前期基本上已经将Spring Security相关的内容写得差不多了,所以最近在整理春天Sexurity Oauh3相关的内容,但在进行到单点登陆(OSS)时,有一个问题一直困扰了我很久,由于网上有关于弹簧启动1。启动2 x升级到春天。x后单点登陆相关的问题解决资料很少,特此在这里专门列一篇文章来描述升级过程中遇到的一些问题,问题表现现象以及我是如何解决这些问题的。
问题一:弹簧引导2中去除了@EnableOAuth3Sso ?
? ?首先很明确的告诉你,并没有! !但为什么引入了<强> spring-security-oauth3 强> maven依赖想法提示@EnableOAuth3Sso找不到呢?首先我们找到官方弹簧引导2。x升级文档,我们会发现其中有关于Oauth3相关的介绍:
比;OAuth 2.0支持功能的Spring Security OAuth项目被迁移到核心Spring Security。OAuth 2.0客户机的支持已被添加和附加功能将迁移。
比;如果你依赖alt="弹簧引导从1。x升级到2。x后单点登陆SSO问题的解决方法">
? ?从图中我们可以看的到,授权服务成功的返回了授权码,但由于我们客户端存在问题,出现401,导致整个授权码模式流程中断。在看官方文的自动档,过程中,无意间发现
祝辞还指出,由于所有端点安全默认情况下,这包括任何默认错误处理端点,例如,端点“/error"。这意味着,如果有一些问题在单一信号alt="弹簧引导从1。x升级到2。x后单点登陆SSO问题的解决方法">
? ?既然明显的提示授权了,那我们就来一步一步的调试看看单点期间出现的问题点是什么。
# # # #三,问题排查及解决方案? ?从之前的现象描述我们可以知道问题点在授权码回来后去调用获取令牌这里出现问题了,那么根据源码查看,获取令牌这块步骤在OAuth3ClientAuthenticationProcessingFilter过滤器内部,其关键代码如下:
<>之前,,,@Override public Authentication  attemptAuthentication (HttpServletRequest 请求,,HttpServletResponse 响应) throws AuthenticationException, IOException, ServletException { OAuth3AccessToken accessToken; try { 时间=accessToken restTemplate.getAccessToken();,,//, 1,调用授权服务获取token },catch (OAuth3Exception e), { BadCredentialsException bad =, new BadCredentialsException (“Could  not obtain access token",, e); 发布(new OAuth3AuthenticationFailureEvent(坏的管理者)); throw 坏; } try { OAuth3Authentication result =, tokenServices.loadAuthentication (accessToken.getValue());,,//,成功后从令牌中解析,,OAuth3Authentication 信息 if (authenticationDetailsSource !=null), { request.setAttribute (OAuth3AuthenticationDetails.ACCESS_TOKEN_VALUE, accessToken.getValue ()); request.setAttribute (OAuth3AuthenticationDetails.ACCESS_TOKEN_TYPE, accessToken.getTokenType ()); result.setDetails (authenticationDetailsSource.buildDetails(请求)); } 发布(new AuthenticationSuccessEvent(结果)); return 结果; } catch (InvalidTokenException e), { BadCredentialsException bad =, new BadCredentialsException (“Could  not obtain user details 得到token",, e); 发布(new OAuth3AuthenticationFailureEvent(坏的管理者)); throw 坏; } }? ?我们把断点打到这里,调试下,果然不出所料,在获取令牌时异常了,异常信息为:可能CSRF发现——状态参数是必需的,但是没有一个国家可以发现,调试截图如下: