提取用户详细信息的 Oauth-2 身份验证需要 CustomPrincipal 对象
Posted
技术标签:
【中文标题】提取用户详细信息的 Oauth-2 身份验证需要 CustomPrincipal 对象【英文标题】:Oauth-2 authentication extracting the user details expects CustomPrincipal object 【发布时间】:2020-01-08 06:28:40 【问题描述】:我得到了这段代码来在 Spring Boot 项目中实现身份验证。除了提取要进行身份验证的用户外,一切正常。我已经搜索并找不到在其他地方找不到解决方案。
public class CustomUserAuthenticationConverter implements UserAuthenticationConverter
private final String EMAIL = "email";
private Collection<? extends GrantedAuthority> defaultAuthorities;
public void setDefaultAuthorities(String[] defaultAuthorities)
this.defaultAuthorities = AuthorityUtils
.commaSeparatedStringToAuthorityList(StringUtils.arrayToCommaDelimitedString(defaultAuthorities));
@Override
public Map<String, ?> convertUserAuthentication(Authentication userAuthentication)
Map<String, Object> response = new LinkedHashMap<String, Object>();
response.put(USERNAME, userAuthentication.getName());
if (userAuthentication.getAuthorities() != null && !userAuthentication.getAuthorities().isEmpty())
response.put(AUTHORITIES, AuthorityUtils.authorityListToSet(userAuthentication.getAuthorities()));
return response;
@Override
public Authentication extractAuthentication(Map<String, ?> map)
if (map.containsKey(USERNAME))
return new UsernamePasswordAuthenticationToken(
new CustomPrincipal(map.get(USERNAME).toString(), map.get(EMAIL).toString()), "N/A",
getAuthorities(map));
return null;
private Collection<? extends GrantedAuthority> getAuthorities(Map<String, ?> map)
if (!map.containsKey(AUTHORITIES))
return defaultAuthorities;
Object authorities = map.get(AUTHORITIES);
if (authorities instanceof String)
return AuthorityUtils.commaSeparatedStringToAuthorityList((String) authorities);
if (authorities instanceof Collection)
return AuthorityUtils.commaSeparatedStringToAuthorityList(
StringUtils.collectionToCommaDelimitedString((Collection<?>) authorities));
throw new IllegalArgumentException("Authorities must be either a String or a Collection");
除了这个方法sn-p之外,其他部分都正常工作
@Override
public Authentication extractAuthentication(Map<String, ?> map)
if (map.containsKey(USERNAME))
return new UsernamePasswordAuthenticationToken(
new CustomPrincipal(map.get(USERNAME).toString(), map.get(EMAIL).toString()), "N/A",
getAuthorities(map));
return null;
我知道它需要一个 CustomPrincipal 对象,其中此字符串作为 USERNAME、EMAIL 传递。我该怎么做才能传递正确的参数?
【问题讨论】:
【参考方案1】:谢谢大家。问题是 Lombok 库创建构造函数失败,所以简单的答案是手动创建它们。
完美运行。 CustomPrincipal 类需要有一个构造函数,该构造函数接受 2 个参数,这些参数是隐式定义的,但在另一个类的类实例化中需要时不会注入
【讨论】:
以上是关于提取用户详细信息的 Oauth-2 身份验证需要 CustomPrincipal 对象的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot OAuth2:如何检索用户令牌信息详细信息
如何使用 OAuth 2.0 通过 Azure Active Directory 对用户进行身份验证?
在弹出窗口中打开 Google SignIn 用户身份验证,需要使用 OAuth 2.0 在同一选项卡本身中打开