首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有多个IDP和表单登录的Spring安全OAuth2 :匹配用户

具有多个IDP和表单登录的Spring安全OAuth2 :匹配用户
EN

Stack Overflow用户
提问于 2019-03-06 15:06:09
回答 1查看 454关注 0票数 0

我在几个项目中多次使用Spring Security,包括Zuul API Gateway上的3条腿的OAuth2身份验证等。所有的工作都很出色,官方文档都非常整洁和简单。

但有一点我仍然不能从文档中得到。假设您有一个基于spring的带有several ID ProvidersResource Server,并且您有自己的用户数据库和表单登录。

因此,用户可以通过表单登录或通过某个身份提供商(比如Google或Facebook)进行身份验证。

问题是:如何将来自任何身份提供商的身份验证与由本地用户增强/映射到本地用户的身份验证对象相匹配?

即: Alice在您的系统中(在您的数据库中)有一个帐户。她进入她的“个人资料”,并声明她也有一个谷歌或Facebook帐户。好了,完成了,你把这个信息保存在你系统的某个地方。

现在,当Alice通过社交网络登录到您的系统时,您使用哪个spring API来了解通过Google输入的Alice与已经在您的数据库中注册的Alice完全相同?基于您的数据库,您在哪个API中通过权威机构增强了her的身份验证?

提前谢谢,伙计们

EN

Stack Overflow用户

回答已采纳

发布于 2019-03-07 01:28:27

通常的做法是创建一个同时包含OidcUser对象和域对象的组合。例如:

代码语言:javascript
复制
@Component
public class MyOAuth2UserService implements OAuth2UserService<OidcUserRequest, OidcUser> {
    private final OidcUserService delegate = new OidcUserService();

    @Override
    public OidcUser loadUser(OidcUserRequest oidcUserRequest) {
        // the information that comes back from google, et al
        OidcUser oidcUser = this.delegate.loadUser(oidcUserRequest);

        // the information from your DB
        MyUser user = this.myRepository.findUserByXYZ(oidcUser.getXYZ());

        return new MyOidcUser(user, oidcUser);
    }

    private static class MyOidcUser extends MyUser implements OidcUser {
        private final OidcUser delegate;

        public MyOidcUser(MyUser user, OidcUser oidcUser) {
            super(user);
            this.delegate = oidcUser;
        }

        // ... implement delegate methods
    }
} 

请注意,XYZ是一些属性,它允许您知道来自谷歌的用户就是来自您系统的用户。例如,也许这就是电子邮件地址。

这项额外工作的好处是Spring Security将把这个MyOidcUser对象放到Authentcation#getPrincipal中。所以现在,如果你需要获取你的域位,你可以使用(MyUser) authentication.getPrincipal(),但是如果你需要OIDC位,你可以使用(OidcUser) authentication.getPrincipal()。根据您的用例,您可以做一些简单的事情,如:

代码语言:javascript
复制
@GetMapping("/endpoint1")
public String endpoint1(@AuthenticationPrincipal MyUser myUser) {
    // ...
}

@GetMapping("/endpoint2")
public String endpoint2(@AuthenticationPrincipal OidcUser oidcUser) {
    URL issuer = oidcUser.getIdToken().getIssuer();
    // ...
}
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55017418

复制
相关文章

相似问题

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