一、问题背景

在使用oauth2获取用户登录信息的时候,如果用户未登录,就会出现 org.springframework.security.web.authentication.WebAuthenticationDetails cannot be cast to org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;

问题如下:

二、原因

问题出现在以下两句代码:

 Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();

通过打印 authentication 对象的authentication.getAuthorities()
authentication.getName()属性我们可以发现:当用户未登录的时候,这两个属性的值分别为:[ROLE_ANONYMOUS]anonymousUser,因此OAuth2AuthenticationDetails在将authentication.getDetails() 转型时出现无法转型的错误,知道为题所在以后我们就可以对症下药了。

三、解决办法

在调用 SysUser user = AuthUtil.getUserInfo();方法获取用户登录信息之前,我们想要判断用户是否登录,判断方法如下:

public class UserLoginCheck {public static boolean userIsLogin() {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();String userName = authentication.getName();String role = authentication.getAuthorities().toString();if ("anonymousUser".toUpperCase(Locale.ROOT).equals(userName.toUpperCase(Locale.ROOT))) {return false;}return !"[ROLE_ANONYMOUS]".equals(role);}
}

如果该方法返回false,则说明用户未登录,所以不要调用 SysUser user = AuthUtil.getUserInfo();方法,直接给出提示即可;通过以上方法可以有效避免本文所遇见的问题。
PS:完整的AuthUtil.java如下:

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;import java.util.Map;/**
* 自定义内容转化器获取用户额外信息
*
* @Author WXZ
* @Time 11:07
* @Date 2021.04.04
*/
public class AuthUtil {/*** 获取用户信息** @return SYSUser*/public static SysUser getUserInfo() {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();Map<String, Object> map = (Map<String, Object>) details.getDecodedDetails();Map<String, String> userInfo = (Map<String, String>) map.get("userInfo");SysUser user = new SysUser();user.setId(userInfo.get("uid"));user.setUsername(userInfo.get("username"));user.setEmail(userInfo.get("email"));user.setNickName(userInfo.get("nickName"));user.setImageUrl(userInfo.get("imageUrl"));user.setMobile(userInfo.get("mobile"));return user;}
}

oauth2 出现 cannot be cast to .security.oauth2.provider.authentication.OAuth2AuthenticationDetails相关推荐

  1. OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 1.咱们先来搭建这个授权微服务,可以看到首先我们要写一个配置类叫做: AuthorizationS ...

  2. 学成在线-第16天-讲义- Spring Security Oauth2 JWT RSA加解密

    学成在线-第16天-讲义- Spring Security Oauth2 JWT 1 用户认证需求分析 1.1 用户认证与授权 ​ 截至目前,项目已经完成了在线学习功能,用户通过在线学习页面点播视频进 ...

  3. Spring Security Oauth2 JWT 实现用户认证授权功能

    Spring Security Oauth2 JWT 一 用户认证授权 1. 需求分析 1.1 用户认证与授权 什么是用户身份认证? 用户身份认证即用户去访问系统资源时系统要求验证用户的身份信息,身份 ...

  4. spring security oauth2 资源服务器配置

    2019独角兽企业重金招聘Python工程师标准>>> import org.springframework.beans.factory.annotation.Autowired; ...

  5. Spring Security Oauth2 如何自定义授权获取token

    Oauth2的默认授权模式有四种: 授权码模式-authorization_code 密码模式-password 客户端模式-client_credentials 隐式授权模式-implicit 我们 ...

  6. Spring Security + OAuth2.0

    授权服务器 授权服务器中有4个端点.说明如下: Authorize Endpoint :授权端点,进行授权. Token Endpoint :令牌端点,经过授权拿到对应的Token. lntrospe ...

  7. 源码分析 - Spring Security OAuth2 生成 token 的执行流程

    说明 本文内容全部基于 Spring Security OAuth2(2.3.5.RELEASE). OAuth2.0 有四种授权模式, 本文会以 密码模式 来举例讲解源码. 阅读前, 需要对 OAu ...

  8. Spring Security Oauth2 授权码模式下 自定义登录、授权页面

    主要说明:基于若依springcloud微服务框架的2.1版本 嫌弃缩进不舒服的,直接访问我的博客站点: http://binarydance.top//aticle_view.html?aticle ...

  9. SpringCloud整合spring security+ oauth2+Redis实现认证授权

    文章目录 设置通用父工程依赖 构建eureka注册中心 构建认证授权服务 配置文件设置 Security配置类 授权服务配置类 登录实现 测试验证 设置通用父工程依赖 在微服务构建中,我们一般用一个父 ...

最新文章

  1. 收藏!美国博士明确给出Python的高效学习技巧
  2. echarts 在.net 中和数据库交互
  3. 解决:Navicat for mysql 设置外键出错
  4. Stateflow子状态激活条件下迁移有效
  5. 【答辩问题】计算机专业本科毕业设计答辩需注意的内容
  6. lua中 只有 nil 和 false 为假, 其他都为真包括0
  7. 动态设置div的高度_DIV块和文字水平垂直居中,点击弹出文字提示
  8. 计算机处理答题卡原理,基于图像处理的答题卡自动阅卷系统的设计与实现
  9. 使用代码调用Attachments(附件)
  10. windows系统清除电脑地址栏文件(夹)路径
  11. 我的基金组合和选择标准
  12. RabbitMQ提示ERROR: epmd error for host
  13. 从前端页面上下载为png格式的图片
  14. 随手写的QT程序:文件大小转化可读字符串,整数转 B,KB,MB......
  15. 计算机无法检测电池损耗怎么办,笔记本电脑如何检测电池损耗程度-鲁大师检测电池损耗的方法 - 河东软件园...
  16. Problem -B DBZ的钥匙
  17. 用python绘制熊猫图案_python – 熊猫:如何在彼此之上绘制年度数据
  18. Docker容器域名解析失败
  19. 课题组王猛的论文被遥感领域顶级期刊 IEEE TGRS 录用
  20. 发票核验API 分享推荐

热门文章

  1. vue项目中,关于echarts报错:To install them, you can run: npm install --save echarts/lib/chart/bar…………
  2. python中如何控制随机的概率_Python3根据基础概率随机生成选项
  3. SpringBootProfile
  4. 通过NFS挂载根文件系统——TQ2440
  5. WRF实例运行(2)
  6. 【高阶累积量】基于高阶累积量的信噪比盲估计法的matlab仿真
  7. 6种难以启齿的离职原因,最好这么说
  8. 鼠标单击经常被当做双击的问题
  9. crontab定时脚本常见报错
  10. Python数据分析笔记:聚类算法之K均值