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 7813ea0564 CAUSEWAY-3698: polishes the SimpleRealm
7813ea0564 is described below

commit 7813ea0564ef882a32d40453d6d8b5d5f2f5ee0a
Author: Andi Huber <[email protected]>
AuthorDate: Thu Mar 21 12:40:25 2024 +0100

    CAUSEWAY-3698: polishes the SimpleRealm
---
 .../simple/authorization/SimpleAuthorizor.java     |  9 +++---
 .../security/simple/realm/SimpleRealm.java         | 34 ++++++++++++++++------
 .../security/simple/SecuritySimpleAuthTest.java    | 18 +++++++++---
 3 files changed, 44 insertions(+), 17 deletions(-)

diff --git 
a/security/simple/src/main/java/org/apache/causeway/security/simple/authorization/SimpleAuthorizor.java
 
b/security/simple/src/main/java/org/apache/causeway/security/simple/authorization/SimpleAuthorizor.java
index 93d432efbb..867a7cbc9a 100644
--- 
a/security/simple/src/main/java/org/apache/causeway/security/simple/authorization/SimpleAuthorizor.java
+++ 
b/security/simple/src/main/java/org/apache/causeway/security/simple/authorization/SimpleAuthorizor.java
@@ -33,6 +33,7 @@ import org.apache.causeway.applib.services.user.UserMemento;
 import org.apache.causeway.core.security.authorization.Authorizor;
 import org.apache.causeway.security.simple.CausewayModuleSecuritySimple;
 import org.apache.causeway.security.simple.realm.SimpleRealm;
+import org.apache.causeway.security.simple.realm.SimpleRealm.Grant;
 
 import lombok.RequiredArgsConstructor;
 
@@ -53,19 +54,19 @@ public class SimpleAuthorizor implements Authorizor {
     @Override
     public boolean isVisible(final InteractionContext ctx, final Identifier 
identifier) {
         return roles(ctx.getUser()).stream()
-            .anyMatch(role->role.grantsRead().test(identifier));
+            
.anyMatch(role->Grant.valueOf(role.grants().apply(identifier)).grantsRead());
     }
 
     @Override
     public boolean isUsable(final InteractionContext ctx, final Identifier 
identifier) {
         return roles(ctx.getUser()).stream()
-                .anyMatch(role->role.grantsChange().test(identifier));
+            
.anyMatch(role->Grant.valueOf(role.grants().apply(identifier)).grantsChange());
     }
 
     protected List<SimpleRealm.Role> roles(final UserMemento userMemento){
         var roles = realm.lookupUserByName(userMemento.getName())
-                .map(SimpleRealm.User::roles)
-                .orElseGet(List::of);
+            .map(SimpleRealm.User::roles)
+            .orElseGet(List::of);
         return roles;
     }
 
diff --git 
a/security/simple/src/main/java/org/apache/causeway/security/simple/realm/SimpleRealm.java
 
b/security/simple/src/main/java/org/apache/causeway/security/simple/realm/SimpleRealm.java
index 890f559e69..0f24b8629e 100644
--- 
a/security/simple/src/main/java/org/apache/causeway/security/simple/realm/SimpleRealm.java
+++ 
b/security/simple/src/main/java/org/apache/causeway/security/simple/realm/SimpleRealm.java
@@ -22,7 +22,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.function.Predicate;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import org.springframework.lang.Nullable;
@@ -37,26 +37,42 @@ import lombok.experimental.Accessors;
 @Component
 public class SimpleRealm {
 
+    public enum Grant {
+        NONE,
+        READ,
+        CHANGE;
+        public boolean grantsRead() {
+            return this==READ
+                    || this==CHANGE;
+        }
+        public boolean grantsChange() {
+            return this==CHANGE;
+        }
+        public static Grant valueOf(@Nullable final Grant grant) {
+            return grant!=null
+                    ? grant
+                    : Grant.NONE;
+        }
+    }
+
     @Value @Accessors(fluent=true)
     public static class Role {
         String name;
-        Predicate<Identifier> grantsRead;
-        Predicate<Identifier> grantsChange;
+        Function<Identifier, Grant> grants;
     }
+
     @Value @Accessors(fluent=true)
     public static class User {
         String name;
         String encryptedPass;
         List<Role> roles;
     }
+
     final Map<String, Role> roles = new HashMap<>();
     final Map<String, User> users = new HashMap<>();
-    public SimpleRealm addRoleWithReadAndChange(final String name, final 
Predicate<Identifier> grants) {
-        roles.put(name, new Role(name, grants, grants));
-        return this;
-    }
-    public SimpleRealm addRoleWithReadOnly(final String name, final 
Predicate<Identifier> grants) {
-        roles.put(name, new Role(name, grants, id->false));
+
+    public SimpleRealm addRole(final String name, final Function<Identifier, 
Grant> grants) {
+        roles.put(name, new Role(name, grants));
         return this;
     }
     public SimpleRealm addUser(final String name, final String pass, final 
List<String> roleNames) {
diff --git 
a/security/simple/src/test/java/org/apache/causeway/security/simple/SecuritySimpleAuthTest.java
 
b/security/simple/src/test/java/org/apache/causeway/security/simple/SecuritySimpleAuthTest.java
index 0a84fa544e..3a9cc1f3dd 100644
--- 
a/security/simple/src/test/java/org/apache/causeway/security/simple/SecuritySimpleAuthTest.java
+++ 
b/security/simple/src/test/java/org/apache/causeway/security/simple/SecuritySimpleAuthTest.java
@@ -42,6 +42,7 @@ import 
org.apache.causeway.core.security.authentication.AuthenticationRequestPas
 import org.apache.causeway.security.simple.authentication.SimpleAuthenticator;
 import org.apache.causeway.security.simple.authorization.SimpleAuthorizor;
 import org.apache.causeway.security.simple.realm.SimpleRealm;
+import org.apache.causeway.security.simple.realm.SimpleRealm.Grant;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
@@ -53,10 +54,19 @@ class SecuritySimpleAuthTest {
 
     private SimpleRealm realm = new SimpleRealm()
                 //roles
-                .addRoleWithReadAndChange("admin_role", id->true)
-                .addRoleWithReadAndChange("order_role", 
id->id.getFullIdentityString().contains("Order"))
-                .addRoleWithReadAndChange("customer_role", 
id->id.getFullIdentityString().contains("Customer"))
-                .addRoleWithReadOnly("reader_role", 
id->!id.getFullIdentityString().contains("TopSecret"))
+                .addRole("admin_role", id->Grant.CHANGE)
+                .addRole("order_role", id->
+                    id.getFullIdentityString().contains("Order")
+                        ? Grant.CHANGE
+                        : Grant.NONE)
+                .addRole("customer_role", id->
+                    id.getFullIdentityString().contains("Customer")
+                        ? Grant.CHANGE
+                        : Grant.NONE)
+                .addRole("reader_role", id->
+                    id.getFullIdentityString().contains("TopSecret")
+                        ? Grant.NONE
+                        : Grant.READ)
                 //users
                 .addUser("sven", passEncoder.encode("pass0"), 
List.of("admin_role"))
                 .addUser("dick", passEncoder.encode("pass1"), 
List.of("reader_role", "order_role"))

Reply via email to