microblog | 微博客
原创
访问
0
获赞
0
评论
相关推荐
暂无数据
最新文章
暂无数据
热门文章
暂无数据

oauth2 出现 cannot be cast to .security.oauth2.provider.authentication.OAuth2AuthenticationDetails

写完bug就找女朋友 2022年02月09日 19:11:42 515 898 6
分类专栏: Java SpringBoot oauth2 SpringCloud 文章标签: oauth2 springcloud springboot SpringSecurity

一、问题背景

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

问题如下:
oauth2 出现 cannot be cast to .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; } }


评论区

登录后参与交流、获取后续更新提醒

写完bug就找女朋友
作者
2023年11月16日 20:25:21
去你妈的lhj
写完bug就找女朋友
作者
2023年11月05日 20:57:55
恋爱脑最容易伤身内耗
写完bug就找女朋友
作者
2023年11月05日 20:54:49
恋爱脑最容易伤身内耗
写完bug就找女朋友
作者
2022年02月09日 10:27:19
想要冰墩墩
写完bug就找女朋友
作者
2022年02月09日 10:21:55
点赞求关注
写完bug就找女朋友
作者
2022年02月08日 16:50:34
新人求带
目录
暂无数据