From c040c6300d295c8366a18333278eac588438197d Mon Sep 17 00:00:00 2001 From: serge-rider Date: Wed, 29 Apr 2020 20:55:53 +0300 Subject: [PATCH] #8 Users and roles model --- .../bundles/io.cloudbeaver.server/plugin.xml | 32 ++++++++- .../cloudbeaver/model/session/WebSession.java | 10 +++ .../model/user/WebAuthProvider.java | 56 ++++++++++++++++ .../cloudbeaver/model/user/WebPermission.java | 59 +++++++++++++++++ .../io/cloudbeaver/model/user/WebRole.java | 63 ++++++++++++++++++ .../io/cloudbeaver/model/user/WebUser.java | 65 +++++++++++++++++++ .../model/user/WebUserCredentials.java | 24 +++++++ .../registry/WebAuthProviderDescriptor.java | 47 ++++++++++++++ .../registry/WebPermissionDescriptor.java | 53 +++++++++++++++ .../server/registry/WebServiceDescriptor.java | 12 ++++ .../server/registry/WebServiceRegistry.java | 17 +++++ .../schema/service.admin.graphqls | 5 +- .../schema/service.auth.graphqls | 6 +- 13 files changed, 443 insertions(+), 6 deletions(-) create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebAuthProvider.java create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebPermission.java create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebRole.java create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUser.java create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUserCredentials.java create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebAuthProviderDescriptor.java create mode 100644 server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebPermissionDescriptor.java diff --git a/server/bundles/io.cloudbeaver.server/plugin.xml b/server/bundles/io.cloudbeaver.server/plugin.xml index 98dee138f2..26bded60e7 100644 --- a/server/bundles/io.cloudbeaver.server/plugin.xml +++ b/server/bundles/io.cloudbeaver.server/plugin.xml @@ -35,8 +35,36 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 a1fe3203a8..dce61d86ab 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 @@ -18,6 +18,7 @@ package io.cloudbeaver.model.session; import io.cloudbeaver.DBWebException; import io.cloudbeaver.WebServiceUtils; +import io.cloudbeaver.model.user.WebUser; import io.cloudbeaver.server.CloudbeaverConstants; import io.cloudbeaver.server.CloudbeaverPlatform; import io.cloudbeaver.model.*; @@ -68,6 +69,7 @@ public class WebSession { private long createTime; private long lastAccessTime; + private WebUser user; private String locale; private final List connections = new ArrayList<>(); @@ -126,6 +128,14 @@ public class WebSession { return lastAccessTime; } + public WebUser getUser() { + return user; + } + + public void setUser(WebUser user) { + this.user = user; + } + @NotNull public String getLocale() { return locale; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebAuthProvider.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebAuthProvider.java new file mode 100644 index 0000000000..7c5d7ef97e --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebAuthProvider.java @@ -0,0 +1,56 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 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.model.user; + +import io.cloudbeaver.server.registry.WebAuthProviderDescriptor; +import io.cloudbeaver.server.registry.WebPermissionDescriptor; +import org.jkiss.dbeaver.Log; + +/** + * Web user. + */ +public class WebAuthProvider { + + private static final Log log = Log.getLog(WebAuthProvider.class); + + private final WebAuthProviderDescriptor descriptor; + + public WebAuthProvider(WebAuthProviderDescriptor descriptor) { + this.descriptor = descriptor; + } + + public String getId() { + return descriptor.getId(); + } + + public String getLabel() { + return descriptor.getLabel(); + } + + public String getIcon() { + return descriptor.getIcon(); + } + + public String getDescription() { + return descriptor.getDescription(); + } + + @Override + public String toString() { + return getId(); + } +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebPermission.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebPermission.java new file mode 100644 index 0000000000..70ad1113a3 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebPermission.java @@ -0,0 +1,59 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 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.model.user; + +import io.cloudbeaver.server.registry.WebPermissionDescriptor; +import org.jkiss.dbeaver.Log; + +/** + * Web user. + */ +public class WebPermission { + + private static final Log log = Log.getLog(WebPermission.class); + + private final WebPermissionDescriptor descriptor; + + public WebPermission(WebPermissionDescriptor descriptor) { + this.descriptor = descriptor; + } + + public String getId() { + return descriptor.getId(); + } + + public String getLabel() { + return descriptor.getLabel(); + } + + public String getDescription() { + return descriptor.getDescription(); + } + + public String getProvider() { + return descriptor.getService().getLabel(); + } + + public String getCategory() { + return descriptor.getCategory(); + } + + @Override + public String toString() { + return getId(); + } +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebRole.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebRole.java new file mode 100644 index 0000000000..8c2dd2c611 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebRole.java @@ -0,0 +1,63 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 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.model.user; + +import org.jkiss.dbeaver.Log; + +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Web role. + */ +public class WebRole { + + private static final Log log = Log.getLog(WebRole.class); + + private String id; + private String label; + private String icon; + private String description; + + private Set permissions = new LinkedHashSet<>(); + + public String getId() { + return id; + } + + public String getLabel() { + return label; + } + + public String getIcon() { + return icon; + } + + public String getDescription() { + return description; + } + + public Set getPermissions() { + return Collections.unmodifiableSet(permissions); + } + + @Override + public String toString() { + return id; + } +} 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 new file mode 100644 index 0000000000..12eb312c86 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUser.java @@ -0,0 +1,65 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 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.model.user; + +import org.jkiss.dbeaver.Log; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * Web user. + */ +public class WebUser { + + private static final Log log = Log.getLog(WebUser.class); + + private String userName; + + private Map metaParameters = new LinkedHashMap<>(); + private Map configurationParameters = new LinkedHashMap<>(); + + private Set roles = new LinkedHashSet<>(); + + private String activeAuthModel; + private Map> authCredentials = new HashMap<>(); + + public String[] getGrantedRoles() { + return roles.stream().map(WebRole::getId).toArray(String[]::new); + } + + public String getUserName() { + return userName; + } + + public Map getMetaParameters() { + return Collections.unmodifiableMap(metaParameters); + } + + public Map getConfigurationParameters() { + return Collections.unmodifiableMap(configurationParameters); + } + + public Set getRoles() { + return Collections.unmodifiableSet(roles); + } + + @Override + public String toString() { + return userName; + } +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUserCredentials.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUserCredentials.java new file mode 100644 index 0000000000..1978dc04da --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUserCredentials.java @@ -0,0 +1,24 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 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.model.user; + +/** + * Web user. + */ +public class WebUserCredentials { + +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebAuthProviderDescriptor.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebAuthProviderDescriptor.java new file mode 100644 index 0000000000..d891ad8850 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebAuthProviderDescriptor.java @@ -0,0 +1,47 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 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.server.registry; + +import org.eclipse.core.runtime.IConfigurationElement; + +/** + * Auth service descriptor + */ +public class WebAuthProviderDescriptor { + + private final IConfigurationElement cfg; + + public WebAuthProviderDescriptor(IConfigurationElement cfg) { + this.cfg = cfg;; + } + + public String getId() { + return cfg.getAttribute("id"); + } + + public String getLabel() { + return cfg.getAttribute("label"); + } + + public String getDescription() { + return cfg.getAttribute("description"); + } + + public String getIcon() { + return cfg.getAttribute("icon"); + } +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebPermissionDescriptor.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebPermissionDescriptor.java new file mode 100644 index 0000000000..062c74feb7 --- /dev/null +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebPermissionDescriptor.java @@ -0,0 +1,53 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 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.server.registry; + +import org.eclipse.core.runtime.IConfigurationElement; + +/** + * Web connection info + */ +public class WebPermissionDescriptor { + + private final WebServiceDescriptor service; + private final IConfigurationElement cfg; + + public WebPermissionDescriptor(WebServiceDescriptor service, IConfigurationElement cfg) { + this.service = service; + this.cfg = cfg;; + } + + public WebServiceDescriptor getService() { + return service; + } + + public String getId() { + return cfg.getAttribute("id"); + } + + public String getLabel() { + return cfg.getAttribute("label"); + } + + public String getDescription() { + return cfg.getAttribute("description"); + } + + public String getCategory() { + return cfg.getAttribute("category"); + } +} diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebServiceDescriptor.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebServiceDescriptor.java index d26be4863d..3c333cac34 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebServiceDescriptor.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebServiceDescriptor.java @@ -22,6 +22,9 @@ import org.eclipse.core.runtime.IConfigurationElement; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.impl.AbstractContextDescriptor; +import java.util.ArrayList; +import java.util.List; + /** * WebServiceDescriptor */ @@ -35,6 +38,7 @@ public class WebServiceDescriptor extends AbstractContextDescriptor { private final ObjectType implClass; private DBWServiceBinding instance; + private final List permissions = new ArrayList<>(); public WebServiceDescriptor(IConfigurationElement config) { @@ -43,6 +47,10 @@ public class WebServiceDescriptor extends AbstractContextDescriptor { this.label = config.getAttribute("label"); this.description = config.getAttribute("description"); this.implClass = new ObjectType(config.getAttribute("class")); + + for (IConfigurationElement pc : config.getChildren("permission")) { + permissions.add(new WebPermissionDescriptor(this, pc)); + } } public String getId() { @@ -57,6 +65,10 @@ public class WebServiceDescriptor extends AbstractContextDescriptor { return description; } + public List getPermissions() { + return permissions; + } + public DBWServiceBinding getInstance() throws DBException { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebServiceRegistry.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebServiceRegistry.java index d8c15d4a3c..cd1de3f2e3 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebServiceRegistry.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/registry/WebServiceRegistry.java @@ -23,13 +23,16 @@ import org.eclipse.core.runtime.Platform; import org.jkiss.dbeaver.Log; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; public class WebServiceRegistry { private static final Log log = Log.getLog(WebServiceRegistry.class); private static final String TAG_SERVICE = "service"; //$NON-NLS-1$ + private static final String TAG_AUTH_MODEL = "authProvider"; //$NON-NLS-1$ private static WebServiceRegistry instance = null; @@ -44,6 +47,8 @@ public class WebServiceRegistry { private final List webServices = new ArrayList<>(); private DBWServiceBinding[] webServiceInstances; + private final Map authProviders = new LinkedHashMap<>(); + private WebServiceRegistry() { } @@ -55,6 +60,9 @@ public class WebServiceRegistry { if (TAG_SERVICE.equals(ext.getName())) { this.webServices.add( new WebServiceDescriptor(ext)); + } else if (TAG_AUTH_MODEL.equals(ext.getName())) { + WebAuthProviderDescriptor providerDescriptor = new WebAuthProviderDescriptor(ext); + this.authProviders.put(providerDescriptor.getId(), providerDescriptor); } } } @@ -94,4 +102,13 @@ public class WebServiceRegistry { public DBWServiceBinding[] getWebServiceInstances() { return webServiceInstances; } + + public List getAuthProviders() { + return new ArrayList<>(authProviders.values()); + } + + public WebAuthProviderDescriptor getAuthProvider(String id) { + return authProviders.get(id); + } + } diff --git a/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls b/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls index 6d3028957a..baa705fcb9 100644 --- a/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls +++ b/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls @@ -2,6 +2,8 @@ type AdminUserInfo { userName: ID! + metaParameters: Object! + configurationParameters: Object! grantedRoles: [ID]! } @@ -13,9 +15,10 @@ type AdminRoleInfo { type AdminPermissionInfo { id: ID! - label: [String] description: [String] + + provider: String! category: String } 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 fef0a1ee47..329cfd1da5 100644 --- a/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls +++ b/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls @@ -8,7 +8,7 @@ type AuthCredentialInfo { order: Int } -type AuthModelInfo { +type AuthProviderInfo { id: ID! label: String! icon: ID @@ -30,12 +30,12 @@ type UserAuthInfo { extend type Query { - authLogin(model: ID!, credentials: Object!): UserAuthInfo + authLogin(provider: ID!, credentials: Object!): UserAuthInfo authLogout: Boolean sessionUser: UserAuthInfo - authModels: [AuthModelInfo]! + authModels: [AuthProviderInfo]! }