This is an automated email from the ASF dual-hosted git repository.

riemer pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-streampipes.git


The following commit(s) were added to refs/heads/dev by this push:
     new 0a86bdf  [STREAMPIPES-480] Update Spring versions and migrate Spring 
config
0a86bdf is described below

commit 0a86bdfc7222e56523f74f8f0d81c9ee9b9cbbab
Author: Dominik Riemer <[email protected]>
AuthorDate: Sun Dec 5 11:13:17 2021 +0100

    [STREAMPIPES-480] Update Spring versions and migrate Spring config
---
 pom.xml                                            |  6 ++--
 .../backend/StreamPipesBackendApplication.java     |  1 +
 .../backend/StreamPipesPasswordEncoder.java        | 33 ++++++++++++++++++++++
 .../streampipes/backend/WebSecurityConfig.java     | 11 +++-----
 .../manager/execution/http/HttpRequestBuilder.java |  2 +-
 .../base/impl/AbstractAuthGuardedRestResource.java | 28 ++++++++++++++++++
 .../impl/dashboard/AbstractDashboardResource.java  | 16 +++++------
 .../streampipes/rest/impl/dashboard/Dashboard.java | 13 +++++----
 .../impl/datalake/DataLakeDashboardResource.java   | 12 ++++----
 9 files changed, 91 insertions(+), 31 deletions(-)

diff --git a/pom.xml b/pom.xml
index ad0f2c8..7ed9727 100644
--- a/pom.xml
+++ b/pom.xml
@@ -102,9 +102,9 @@
         <snakeyaml.version>1.26</snakeyaml.version>
         <snappy-java.version>1.1.7.7</snappy-java.version>
         <spark.version>2.1.2</spark.version>
-        <spring.version>5.3.10</spring.version>
-        <spring-boot.version>2.5.5</spring-boot.version>
-        <spring-security.version>5.5.2</spring-security.version>
+        <spring.version>5.3.13</spring.version>
+        <spring-boot.version>2.6.1</spring-boot.version>
+        <spring-security.version>5.6.0</spring-security.version>
         <swagger.version>2.1.6</swagger.version>
         <type-parser.version>0.6.0</type-parser.version>
         <underscore.version>1.47</underscore.version>
diff --git 
a/streampipes-backend/src/main/java/org/apache/streampipes/backend/StreamPipesBackendApplication.java
 
b/streampipes-backend/src/main/java/org/apache/streampipes/backend/StreamPipesBackendApplication.java
index af97e1d..c78b8a6 100644
--- 
a/streampipes-backend/src/main/java/org/apache/streampipes/backend/StreamPipesBackendApplication.java
+++ 
b/streampipes-backend/src/main/java/org/apache/streampipes/backend/StreamPipesBackendApplication.java
@@ -58,6 +58,7 @@ import java.util.stream.Collectors;
 @EnableAutoConfiguration
 @Import({StreamPipesResourceConfig.class,
         WelcomePageController.class,
+        StreamPipesPasswordEncoder.class,
         WebSecurityConfig.class,
         SpPermissionEvaluator.class
 })
diff --git 
a/streampipes-backend/src/main/java/org/apache/streampipes/backend/StreamPipesPasswordEncoder.java
 
b/streampipes-backend/src/main/java/org/apache/streampipes/backend/StreamPipesPasswordEncoder.java
new file mode 100644
index 0000000..b6e5cca
--- /dev/null
+++ 
b/streampipes-backend/src/main/java/org/apache/streampipes/backend/StreamPipesPasswordEncoder.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.streampipes.backend;
+
+import 
org.apache.streampipes.user.management.authentication.StreamPipesCredentialsMatcher;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Component;
+
+@Component
+public class StreamPipesPasswordEncoder {
+
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new StreamPipesCredentialsMatcher();
+    }
+}
diff --git 
a/streampipes-backend/src/main/java/org/apache/streampipes/backend/WebSecurityConfig.java
 
b/streampipes-backend/src/main/java/org/apache/streampipes/backend/WebSecurityConfig.java
index 5d59c58..ac9c385 100644
--- 
a/streampipes-backend/src/main/java/org/apache/streampipes/backend/WebSecurityConfig.java
+++ 
b/streampipes-backend/src/main/java/org/apache/streampipes/backend/WebSecurityConfig.java
@@ -42,14 +42,16 @@ import 
org.springframework.security.web.authentication.UsernamePasswordAuthentic
 public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
   private final UserDetailsService userDetailsService;
+  private StreamPipesPasswordEncoder passwordEncoder;
 
-  public WebSecurityConfig() {
+  public WebSecurityConfig(StreamPipesPasswordEncoder passwordEncoder) {
+    this.passwordEncoder = passwordEncoder;
     this.userDetailsService = new SpUserDetailsService();
   }
 
   @Autowired
   public void configureGlobal(AuthenticationManagerBuilder auth) throws 
Exception {
-    
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
+    
auth.userDetailsService(userDetailsService).passwordEncoder(this.passwordEncoder.passwordEncoder());
   }
 
   @Override
@@ -82,11 +84,6 @@ public class WebSecurityConfig extends 
WebSecurityConfigurerAdapter {
     return userDetailsService;
   }
 
-  @Bean
-  public PasswordEncoder passwordEncoder() {
-    return new StreamPipesCredentialsMatcher();
-  }
-
   @Bean(BeanIds.AUTHENTICATION_MANAGER)
   @Override
   public AuthenticationManager authenticationManagerBean() throws Exception {
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/HttpRequestBuilder.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/HttpRequestBuilder.java
index 54653ff..671235a 100644
--- 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/HttpRequestBuilder.java
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/execution/http/HttpRequestBuilder.java
@@ -108,7 +108,7 @@ public class HttpRequestBuilder {
                 .findForObjectId(this.pipelineId)
                 .stream()
                 .findFirst()
-                .map(Permission::getOwnerSid).orElseThrow(() -> new 
IllegalArgumentException("Could not find owner for pipeline"));
+                .map(Permission::getOwnerSid).orElseThrow(() -> new 
IllegalArgumentException("Could not find owner for pipeline " + pipelineId));
 
         Principal correspondingUser = new 
SpResourceManager().manageUsers().getPrincipalById(ownerSid);
         return "Bearer " + new 
JwtTokenProvider().createToken(correspondingUser);
diff --git 
a/streampipes-rest-core-base/src/main/java/org/apache/streampipes/rest/core/base/impl/AbstractAuthGuardedRestResource.java
 
b/streampipes-rest-core-base/src/main/java/org/apache/streampipes/rest/core/base/impl/AbstractAuthGuardedRestResource.java
index 1e24ff5..d04273e 100644
--- 
a/streampipes-rest-core-base/src/main/java/org/apache/streampipes/rest/core/base/impl/AbstractAuthGuardedRestResource.java
+++ 
b/streampipes-rest-core-base/src/main/java/org/apache/streampipes/rest/core/base/impl/AbstractAuthGuardedRestResource.java
@@ -17,17 +17,25 @@
  */
 package org.apache.streampipes.rest.core.base.impl;
 
+import org.apache.streampipes.model.client.user.Role;
 import org.apache.streampipes.user.management.model.PrincipalUserDetails;
 import org.springframework.security.core.context.SecurityContextHolder;
 
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.SecurityContext;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 public class AbstractAuthGuardedRestResource extends AbstractRestResource {
 
   @Context
   protected SecurityContext securityContext;
 
+  private static final List<String> adminRoles = Arrays.asList(
+          Role.Constants.ROLE_ADMIN_VALUE,
+          Role.Constants.ROLE_SERVICE_ADMIN_VALUE);
+
   protected boolean isAuthenticated() {
     return this.securityContext.getUserPrincipal() != null;
   }
@@ -44,4 +52,24 @@ public class AbstractAuthGuardedRestResource extends 
AbstractRestResource {
     return getPrincipal().getDetails().getPrincipalId();
   }
 
+  protected boolean isAdminOrHasAnyAuthority(String... authorities) {
+    List<String> allAuthorities = new ArrayList<>(Arrays.asList(authorities));
+    allAuthorities.addAll(adminRoles);
+    return hasAnyAuthority(allAuthorities);
+  }
+
+  protected boolean hasAnyAuthority(String... authorities) {
+    return hasAnyAuthority(Arrays.asList(authorities));
+  }
+
+  protected boolean hasAnyAuthority(List<String> authorities) {
+    return isAuthenticated() &&
+            SecurityContextHolder
+                    .getContext()
+                    .getAuthentication()
+                    .getAuthorities()
+                    .stream()
+                    .anyMatch(a -> authorities.contains(a.getAuthority()));
+  }
+
 }
diff --git 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java
 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java
index 32bd69c..3638e5d 100644
--- 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java
+++ 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java
@@ -35,7 +35,7 @@ public abstract class AbstractDashboardResource extends 
AbstractAuthGuardedRestR
   @GET
   @Produces(MediaType.APPLICATION_JSON)
   @JacksonSerialized
-  @PreAuthorize("hasAnyAuthority(#root.this.getReadRoles())")
+  @PreAuthorize("this.hasReadAuthority()")
   @PostFilter("hasPermission(filterObject.couchDbId, 'READ')")
   public List<DashboardModel> getAllDashboards() {
     return getResourceManager().findAll();
@@ -44,7 +44,7 @@ public abstract class AbstractDashboardResource extends 
AbstractAuthGuardedRestR
   @GET
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{dashboardId}")
-  @PreAuthorize("hasAnyAuthority(#root.this.getReadRoles()) and 
hasPermission(#dashboardId, 'READ')")
+  @PreAuthorize("this.hasReadAuthority() and hasPermission(#dashboardId, 
'READ')")
   public DashboardModel getDashboard(@PathParam("dashboardId") String 
dashboardId) {
     return getResourceManager().find(dashboardId);
   }
@@ -52,7 +52,7 @@ public abstract class AbstractDashboardResource extends 
AbstractAuthGuardedRestR
   @PUT
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{dashboardId}")
-  @PreAuthorize("hasAnyAuthority(#root.this.getWriteRoles()) and 
hasPermission(#dashboardModel.couchDbId, 'WRITE')")
+  @PreAuthorize("this.hasWriteAuthority() and 
hasPermission(#dashboardModel.couchDbId, 'WRITE')")
   public DashboardModel modifyDashboard(DashboardModel dashboardModel) {
     getResourceManager().update(dashboardModel);
     return getResourceManager().find(dashboardModel.getCouchDbId());
@@ -61,7 +61,7 @@ public abstract class AbstractDashboardResource extends 
AbstractAuthGuardedRestR
   @DELETE
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{dashboardId}")
-  @PreAuthorize("hasAnyAuthority(#root.this.getDeleteRoles()) and 
hasPermission(#dashboardId, 'DELETE')")
+  @PreAuthorize("this.hasDeleteAuthority() and hasPermission(#dashboardId, 
'DELETE')")
   public Response deleteDashboard(@PathParam("dashboardId") String 
dashboardId) {
     getResourceManager().delete(dashboardId);
     return ok();
@@ -69,7 +69,7 @@ public abstract class AbstractDashboardResource extends 
AbstractAuthGuardedRestR
 
   @POST
   @Produces(MediaType.APPLICATION_JSON)
-  @PreAuthorize("hasAnyAuthority(#root.this.getWriteRoles())")
+  @PreAuthorize("this.hasWriteAuthority()")
   public Response createDashboard(DashboardModel dashboardModel) {
     getResourceManager().create(dashboardModel, getAuthenticatedUserSid());
     return ok();
@@ -81,10 +81,10 @@ public abstract class AbstractDashboardResource extends 
AbstractAuthGuardedRestR
    * Do not delete these abstract methods below - required by Spring SPEL (see 
above)
    */
 
-  public abstract String getWriteRoles();
+  public abstract boolean hasReadAuthority();
 
-  public abstract String getReadRoles();
+  public abstract boolean hasWriteAuthority();
 
-  public abstract String getDeleteRoles();
+  public abstract boolean hasDeleteAuthority();
 
 }
diff --git 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/Dashboard.java
 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/Dashboard.java
index db545e7..144c7d9 100644
--- 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/Dashboard.java
+++ 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/Dashboard.java
@@ -24,6 +24,7 @@ import 
org.apache.streampipes.resource.management.AbstractDashboardResourceManag
 import org.springframework.stereotype.Component;
 
 import javax.ws.rs.Path;
+import java.util.Arrays;
 
 @Path("/v2/dashboard/dashboards")
 @Component
@@ -35,17 +36,17 @@ public class Dashboard extends AbstractDashboardResource {
     }
 
     @Override
-    public String getWriteRoles() {
-        return Role.Constants.ROLE_ADMIN_VALUE + ", " 
+Privilege.Constants.PRIVILEGE_WRITE_DASHBOARD_VALUE;
+    public boolean hasReadAuthority() {
+        return 
isAdminOrHasAnyAuthority(Privilege.Constants.PRIVILEGE_READ_DASHBOARD_VALUE);
     }
 
     @Override
-    public String getReadRoles() {
-        return Role.Constants.ROLE_ADMIN_VALUE + ", " 
+Privilege.Constants.PRIVILEGE_READ_DASHBOARD_VALUE;
+    public boolean hasWriteAuthority() {
+        return 
isAdminOrHasAnyAuthority(Privilege.Constants.PRIVILEGE_WRITE_DASHBOARD_VALUE);
     }
 
     @Override
-    public String getDeleteRoles() {
-        return Role.Constants.ROLE_ADMIN_VALUE + ", " 
+Privilege.Constants.PRIVILEGE_DELETE_DASHBOARD_VALUE;
+    public boolean hasDeleteAuthority() {
+        return 
isAdminOrHasAnyAuthority(Privilege.Constants.PRIVILEGE_DELETE_DASHBOARD_VALUE);
     }
 }
diff --git 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeDashboardResource.java
 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeDashboardResource.java
index be50911..6aa6a5f 100644
--- 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeDashboardResource.java
+++ 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeDashboardResource.java
@@ -37,17 +37,17 @@ public class DataLakeDashboardResource extends 
AbstractDashboardResource {
     }
 
     @Override
-    public String getWriteRoles() {
-        return Role.Constants.ROLE_ADMIN_VALUE + ", " + 
Privilege.Constants.PRIVILEGE_WRITE_DATA_EXPLORER_VIEW_VALUE;
+    public boolean hasReadAuthority() {
+        return 
isAdminOrHasAnyAuthority(Privilege.Constants.PRIVILEGE_READ_DATA_EXPLORER_VIEW_VALUE);
     }
 
     @Override
-    public String getReadRoles() {
-        return Role.Constants.ROLE_ADMIN_VALUE + ", " 
+Privilege.Constants.PRIVILEGE_READ_DATA_EXPLORER_VIEW_VALUE;
+    public boolean hasWriteAuthority() {
+        return 
isAdminOrHasAnyAuthority(Privilege.Constants.PRIVILEGE_WRITE_DATA_EXPLORER_VIEW_VALUE);
     }
 
     @Override
-    public String getDeleteRoles() {
-        return Role.Constants.ROLE_ADMIN_VALUE + ", " 
+Privilege.Constants.PRIVILEGE_READ_DATA_EXPLORER_VIEW_VALUE;
+    public boolean hasDeleteAuthority() {
+        return 
isAdminOrHasAnyAuthority(Privilege.Constants.PRIVILEGE_DELETE_DATA_EXPLORER_VIEW_VALUE);
     }
 }

Reply via email to