From 08f531afe87a1226f435ea4db1085d2d277bfc93 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Tue, 5 May 2020 00:43:17 +0300 Subject: [PATCH] External auth providers, user display name --- .../io/cloudbeaver/DBWAuthProviderExternal.java | 8 ++++++++ .../src/io/cloudbeaver/model/user/WebUser.java | 12 ++++++++++++ .../schema/service.auth.graphqls | 5 +++++ .../io/cloudbeaver/service/auth/WebAuthInfo.java | 16 +++++++++++----- .../service/auth/impl/WebServiceAuthImpl.java | 16 ++++++++++------ 5 files changed, 46 insertions(+), 11 deletions(-) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWAuthProviderExternal.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWAuthProviderExternal.java index bb9536de28..4248972bb5 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWAuthProviderExternal.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWAuthProviderExternal.java @@ -17,7 +17,10 @@ package io.cloudbeaver; import io.cloudbeaver.model.user.WebUser; +import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; +import org.jkiss.utils.CommonUtils; import java.util.Map; @@ -29,11 +32,16 @@ public interface DBWAuthProviderExternal extends DBWAuthProvider readExternalCredentials( Map providerConfig, // Auth provider configuration (e.g. 3rd party auth server address) Map authParameters // Passed auth parameters (e.g. user name or password) ) throws DBException; + @NotNull WebUser registerNewUser(DBWSecurityController securityController, Map providerConfig, Map credentials) throws DBException; + @Nullable + String getUserDisplayName(Map providerConfig, Map credentials); + } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUser.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUser.java index 7df5affe55..a2393d37fb 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUser.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUser.java @@ -30,6 +30,7 @@ public class WebUser { @NotNull private final String userId; + private String displayName; private Map metaParameters = new LinkedHashMap<>(); private Map configurationParameters = new LinkedHashMap<>(); @@ -48,6 +49,17 @@ public class WebUser { return userId; } + /** + * User display name may be set by 3rd party auth providers + */ + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + public String[] getGrantedRoles() { return roles.stream().map(WebRole::getId).toArray(String[]::new); } diff --git a/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls b/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls index b74d4185f9..1b3e549dee 100644 --- a/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls +++ b/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls @@ -30,8 +30,13 @@ type AuthProviderInfo { } type UserAuthInfo { + # User unique identifier userId: String! + # Human readable display name. May be null + displayName: String + # Auth provider ID authProvider: String! + loginTime: DateTime! # Optional login message diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebAuthInfo.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebAuthInfo.java index 4f2130a875..1caf60eafc 100644 --- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebAuthInfo.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebAuthInfo.java @@ -16,6 +16,8 @@ */ package io.cloudbeaver.service.auth; +import io.cloudbeaver.model.user.WebUser; + import java.time.LocalDate; import java.time.OffsetDateTime; import java.util.Date; @@ -25,18 +27,22 @@ import java.util.Date; */ public class WebAuthInfo { - private String userId; + private WebUser user; private String authProvider; private Object authToken; private OffsetDateTime loginTime; private String message; - public String getUserId() { - return userId; + public WebAuthInfo(WebUser user) { + this.user = user; } - public void setUserId(String userId) { - this.userId = userId; + public String getUserId() { + return user.getUserId(); + } + + public String getDisplayName() { + return user.getDisplayName(); } public String getAuthProvider() { diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java index 3e5c4e6148..7dddc1d2e2 100644 --- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java @@ -84,18 +84,22 @@ public class WebServiceAuthImpl implements DBWServiceAuth { providerConfig, userCredentials, authParameters); - WebAuthInfo authInfo = new WebAuthInfo(); - authInfo.setUserId(userId); - authInfo.setLoginTime(OffsetDateTime.now()); - authInfo.setAuthProvider(authProvider.getId()); - authInfo.setAuthToken(authToken); - authInfo.setMessage("Authenticated with " + authProvider.getLabel() + " provider"); if (user == null) { user = new WebUser(userId); } + if (authProviderExternal != null) { + user.setDisplayName(authProviderExternal.getUserDisplayName(providerConfig, authParameters)); + } + webSession.setUser(user); + WebAuthInfo authInfo = new WebAuthInfo(user); + authInfo.setLoginTime(OffsetDateTime.now()); + authInfo.setAuthProvider(authProvider.getId()); + authInfo.setAuthToken(authToken); + authInfo.setMessage("Authenticated with " + authProvider.getLabel() + " provider"); + return authInfo; } catch (DBException e) { throw new DBWebException("User authentication failed", e);