提取用户详细信息的 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 在同一选项卡本身中打开

如何使用基本身份验证而不是 OAuth 2.0 将 Alexa 用户与 3rd 方应用程序相关联

HTTP 基本身份验证和 OAuth 2.0 相同吗?

OAuth 2.0应该用于身份验证超时吗?