You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2023/07/21 05:44:51 UTC

[causeway] branch master updated: CAUSEWAY-3519: wkt vwr: attempted fix of regression with delegated authentication

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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new a6cba5ca36 CAUSEWAY-3519: wkt vwr: attempted fix of regression with delegated authentication
a6cba5ca36 is described below

commit a6cba5ca3669085bed36fe933c85f66be612bc9c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jul 21 07:44:47 2023 +0200

    CAUSEWAY-3519: wkt vwr: attempted fix of regression with delegated
    authentication
---
 .../AuthenticatedWebSessionForCauseway.java          | 17 +++++++++++++++++
 .../integration/WebRequestCycleForCauseway.java      | 20 +++++++++++++++-----
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/AuthenticatedWebSessionForCauseway.java b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/AuthenticatedWebSessionForCauseway.java
index 2799709bee..fbb80fa5ec 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/AuthenticatedWebSessionForCauseway.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/AuthenticatedWebSessionForCauseway.java
@@ -49,6 +49,7 @@ import org.apache.causeway.viewer.wicket.ui.components.widgets.breadcrumbs.Bread
 import org.apache.causeway.viewer.wicket.ui.pages.BookmarkedPagesModelProvider;
 
 import lombok.Getter;
+import lombok.NonNull;
 import lombok.val;
 
 /**
@@ -90,6 +91,22 @@ implements
         this.authentication = authentication;
     }
 
+    /**
+     * If there is an {@link InteractionContext} already (primed)
+     * (as some authentication mechanisms setup in filters,
+     * eg SpringSecurityFilter), then just use it.
+     * <p>
+     * However, for authorization, the authentication still must pass
+     * {@link AuthenticationManager} checks,
+     * as done in {@link #getAuthentication()},
+     * which on success also sets the signIn flag.
+     * <p>
+     * Called by {@link WebRequestCycleForCauseway}.
+     */
+    public void setPrimedInteractionContext(final @NonNull InteractionContext authentication) {
+        this.authentication = authentication;
+    }
+
     @Getter
     private UUID sessionGuid;
     private String cachedSessionId;
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java
index c761989225..457fb66974 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/causeway/viewer/wicket/viewer/integration/WebRequestCycleForCauseway.java
@@ -142,14 +142,24 @@ implements
         // but fail early if the current user is impersonating
         // (seeing this if going back the browser history into a page, that was previously impersonated)
         val interactionService = getInteractionService();
+        val authenticatedWebSession = AuthenticatedWebSessionForCauseway.get();
+
+        /*XXX for debugging delegated user ...
+        interactionService.openInteraction(InteractionContext
+                .ofUserWithSystemDefaults(
+                        UserMemento.ofName("delegated")
+                        .withRoleAdded(UserMemento.AUTHORIZED_USER_ROLE)
+                        .withAuthenticationSource(AuthenticationSource.EXTERNAL)));*/
+
         val currentInteractionContext = interactionService.currentInteractionContext();
-        if(currentInteractionContext.isPresent()
-                && currentInteractionContext.get().getUser().isImpersonating()) {
-            throw _Exceptions.illegalState("cannot enter a new request cycle with a left over impersonating user");
+        if(currentInteractionContext.isPresent()) {
+            if(currentInteractionContext.get().getUser().isImpersonating()) {
+                throw _Exceptions.illegalState("cannot enter a new request cycle with a left over impersonating user");
+            }
+            authenticatedWebSession.setPrimedInteractionContext(currentInteractionContext.get());
         }
-        val interactionContext0 = currentInteractionContext
-            .orElseGet(AuthenticatedWebSessionForCauseway.get()::getAuthentication);
 
+        val interactionContext0 = authenticatedWebSession.getAuthentication();
         if (interactionContext0 == null) {
             log.warn("onBeginRequest out - session was not opened (because no authentication)");
             return;