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

问题描述 投票:0回答:1

我已经在多个项目上多次使用Spring Security,包括在Zuul API Gateway上进行3脚OAuth2身份验证等。所有工作都非常出色,官方文档非常简洁。

但有一点我仍然没有从文档中获得。想象一下,你有一个基于弹簧的Resource Serverseveral ID Providers,你也有自己的用户数据库和表单登录。

因此,用户可以通过表单登录或通过其中一个IDP(比如Google或Facebook)进行身份验证。

问题是:如何将来自任何IDP的身份验证与通过/映射到本地用户的身份验证对象进行匹配?

I.e。:Alice在您的系统中有一个帐户(在您的数据库中)。她进入了她的“个人资料”并声明她还拥有Google或Facebook帐户。好的,完成后,您将此信息保存在系统中的某个位置。

现在,当Alice通过社交网络登录您的系统时,您使用什么样的Spring API来了解Alice通过Google输入的是完全相同的已经在您的数据库中注册的Alice?在什么API中,您根据数据库增强了对权限的身份验证?

先谢谢你,伙计们

spring-boot spring-security oauth-2.0 spring-security-oauth2
1个回答
1
投票

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

@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是一些属性,可让您知道Google中的用户是您系统中的用户。也许这就是电子邮件地址,例如。

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

@GetMapping("/endpoint1")
public String endpoint1(@AuthenticationPrincipal MyUser myUser) {
    // ...
}

@GetMapping("/endpoint2")
public String endpoint2(@AuthenticationPrincipal OidcUser oidcUser) {
    URL issuer = oidcUser.getIdToken().getIssuer();
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.