From 6ababe41c6d80e43674aedfe320889e36eea5ea2 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Sun, 14 Mar 2021 17:16:01 +0300 Subject: [PATCH] CB-793 Auth API additions --- .../cloudbeaver/model/session/WebSession.java | 6 +++ .../schema/service.auth.graphqls | 42 ++++++++++++--- .../service/auth/DBWServiceAuth.java | 4 ++ .../service/auth/WebServiceBindingAuth.java | 1 + .../cloudbeaver/service/auth/WebUserInfo.java | 53 +++++++++++++++++++ .../service/auth/impl/WebServiceAuthImpl.java | 9 ++++ 6 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java index 3c36625a08..56f74fab8e 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java @@ -645,6 +645,12 @@ public class WebSession implements DBASession, DBAAuthCredentialsProvider, IAdap } } + public List getAllAuthInfo() { + synchronized (authTokens) { + return new ArrayList<>(authTokens); + } + } + public void addAuthInfo(@NotNull WebAuthInfo authInfo) throws DBException { WebUser newUser = authInfo.getUser(); if (this.user == null && newUser != null) { 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 736015c54a..817468382b 100644 --- a/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls +++ b/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls @@ -30,30 +30,56 @@ type AuthProviderInfo { credentialParameters: [AuthCredentialInfo!]! } -type UserAuthInfo { - # User unique identifier - userId: String! - # Human readable display name. May be null - displayName: String - # Auth provider ID - authProvider: String! +type UserAuthToken { + # Auth provider used for autgorization + provider: ID! + # Authorization time loginTime: DateTime! # Optional login message message: String + # Auth origin origin: ObjectOrigin! } +type UserAuthInfo { + # User unique identifier + userId: String! @deprecated + # Human readable display name. May be null + displayName: String @deprecated + # Auth provider ID + authProvider: String! @deprecated + + loginTime: DateTime! @deprecated + + # Optional login message + message: String @deprecated + + origin: ObjectOrigin! @deprecated +} + +type UserInfo { + # User unique identifier + userId: String! + # Human readable display name. May be null + displayName: String + + authTokens: [UserAuthToken!]! +} + extend type Query { # Authorize user using specified auth provider + authLogin(provider: ID!, credentials: Object!): UserAuthInfo! # Logouts user. If provider not specified then all authorizations are revoked from session. authLogout(provider: ID): Boolean - sessionUser: UserAuthInfo + activeUser: UserInfo + + sessionUser: UserAuthInfo @deprecated authProviders: [AuthProviderInfo!]! diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java index facbfe94ba..e6cea14af4 100644 --- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/DBWServiceAuth.java @@ -38,6 +38,10 @@ public interface DBWServiceAuth extends DBWService { @WebAction(requirePermissions = {} ) void authLogout(@NotNull WebSession webSession, @Nullable String providerId) throws DBWebException; + @WebAction(requirePermissions = {}) + WebUserInfo activeUser(@NotNull WebSession webSession) throws DBWebException; + + @Deprecated @WebAction(requirePermissions = {}) WebAuthInfo sessionUser(@NotNull WebSession webSession) throws DBWebException; diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebServiceBindingAuth.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebServiceBindingAuth.java index 5e1434ac68..87a3ba7e9b 100644 --- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebServiceBindingAuth.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebServiceBindingAuth.java @@ -43,6 +43,7 @@ public class WebServiceBindingAuth extends WebServiceBindingBase getService(env).authLogout(getWebSession(env), env.getArgument("provider")); return true; }) + .dataFetcher("activeUser", env -> getService(env).activeUser(getWebSession(env, false))) .dataFetcher("sessionUser", env -> getService(env).sessionUser(getWebSession(env, false))) .dataFetcher("authProviders", env -> getService(env).getAuthProviders(getWebSession(env))) ; diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java new file mode 100644 index 0000000000..53aec5fc71 --- /dev/null +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java @@ -0,0 +1,53 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2021 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.cloudbeaver.service.auth; + +import io.cloudbeaver.model.session.WebAuthInfo; +import io.cloudbeaver.model.session.WebSession; +import io.cloudbeaver.model.user.WebUser; +import org.jkiss.dbeaver.Log; + +import java.util.List; + +/** + * WebUserInfo + */ +public class WebUserInfo { + + private static final Log log = Log.getLog(WebUserInfo.class); + + private final WebSession session; + private final WebUser user; + + public WebUserInfo(WebSession session, WebUser user) { + this.session = session; + this.user = user; + } + + public String getUserId() { + return user.getUserId(); + } + + public String getDisplayName() { + return user.getDisplayName(); + } + + public List getAuthTokens() { + return session.getAllAuthInfo(); + } + +} 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 58df254883..18e315e983 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 @@ -26,6 +26,7 @@ import io.cloudbeaver.registry.WebServiceRegistry; import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.server.CBPlatform; import io.cloudbeaver.service.auth.DBWServiceAuth; +import io.cloudbeaver.service.auth.WebUserInfo; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; @@ -127,6 +128,14 @@ public class WebServiceAuthImpl implements DBWServiceAuth { webSession.removeAuthInfo(providerId); } + @Override + public WebUserInfo activeUser(@NotNull WebSession webSession) throws DBWebException { + if (webSession.getUser() == null) { + return null; + } + return new WebUserInfo(webSession, webSession.getUser()); + } + @Override public WebAuthInfo sessionUser(@NotNull WebSession webSession) throws DBWebException { if (webSession.getUser() == null) {