首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oauth-2身份验证提取用户详细信息需要CustomPrincipal对象

Oauth-2身份验证提取用户详细信息需要CustomPrincipal对象
EN

Stack Overflow用户
提问于 2019-09-05 19:01:13
回答 1查看 30关注 0票数 1

我获得这段代码是为了在Spring boot项目中实现身份验证。除了提取要进行身份验证的用户之外,一切都很正常。我已经找过了,找不到,在别的地方也找不到答案。

代码语言:javascript
复制
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");
    }

}

除此方法片段外,其他部分都工作正常

代码语言:javascript
复制
@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对象,在这个对象中,这个字符串作为用户名,电子邮件传递。我该怎么做才能传递正确的参数?

EN

回答 1

Stack Overflow用户

发布于 2019-09-07 04:22:02

谢谢大家。The.problem认为Lombok库创建构造函数失败,所以简单的答案是手动创建它们。

它工作得很完美。CustomPrincipal类需要有一个接受2个参数的构造函数,这2个参数是隐式定义的,但在另一个类的类实例化中需要时不会注入

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57804022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档