From ed4b9fc5e6e5f58135e43d39dfff5d221d6917e1 Mon Sep 17 00:00:00 2001 From: Geert Bevin Date: Fri, 23 Dec 2022 14:49:57 -0500 Subject: [PATCH] Reworked auth config to allow for different identity attributes in different configs. --- .../main/java/rife/HelloAuthentication.java | 2 +- .../authentication/elements/AuthConfig.java | 4 ++-- .../authentication/elements/Identified.java | 20 +++++++++++++++---- .../rife/authentication/elements/Logout.java | 2 +- .../rife/engine/EngineTemplateProcessor.java | 16 ++++++++++----- .../elements/DatabaseAuthenticatedSite.java | 2 +- .../elements/MemoryAuthenticatedSite.java | 2 +- 7 files changed, 33 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/rife/HelloAuthentication.java b/app/src/main/java/rife/HelloAuthentication.java index 60d51ac4..5627c676 100644 --- a/app/src/main/java/rife/HelloAuthentication.java +++ b/app/src/main/java/rife/HelloAuthentication.java @@ -24,7 +24,7 @@ public class HelloAuthentication extends Site { before(new Authenticated(config)); landing = get("/hello", c -> { var t = c.template("HelloAuthenticated"); - t.setValue("user", AuthConfig.identityAttribute(c).getLogin()); + t.setValue("user", config.identityAttribute(c).getLogin()); c.print(t); }); logout = get("/logout", new Logout(config, TemplateFactory.HTML.get("HelloLogout"))); diff --git a/lib/src/main/java/rife/authentication/elements/AuthConfig.java b/lib/src/main/java/rife/authentication/elements/AuthConfig.java index ed59edd8..1bb434a0 100644 --- a/lib/src/main/java/rife/authentication/elements/AuthConfig.java +++ b/lib/src/main/java/rife/authentication/elements/AuthConfig.java @@ -62,11 +62,11 @@ public class AuthConfig { return this; } - public static String identityAttributeName() { + public String identityAttributeName() { return DEFAULT_IDENTITY_ATTRIBUTE_NAME; } - public static RoleUserIdentity identityAttribute(Context c) { + public RoleUserIdentity identityAttribute(Context c) { return (RoleUserIdentity) c.attribute(identityAttributeName()); } diff --git a/lib/src/main/java/rife/authentication/elements/Identified.java b/lib/src/main/java/rife/authentication/elements/Identified.java index d1b94d44..2fa02bbc 100644 --- a/lib/src/main/java/rife/authentication/elements/Identified.java +++ b/lib/src/main/java/rife/authentication/elements/Identified.java @@ -15,6 +15,19 @@ public class Identified implements Element { authConfig_ = config; } + public static Identified getIdentifiedElementInRequest(Context c) { + var identified = c.attribute(Identified.class.getName()); + if (identified instanceof Identified result) { + return result; + } + + return null; + } + + public AuthConfig getAuthConfig() { + return authConfig_; + } + public void process(Context c) throws Exception { if (!c.hasAttribute(authConfig_.identityAttributeName())) { @@ -22,16 +35,15 @@ public class Identified implements Element { } } - public void setIdentityAttribute(Context c) - throws Exception { + public void setIdentityAttribute(Context c) { var identity = getIdentity(c); if (identity != null) { + c.setAttribute(Identified.class.getName(), this); c.setAttribute(authConfig_.identityAttributeName(), identity); } } - public RoleUserIdentity getIdentity(Context c) - throws Exception { + public RoleUserIdentity getIdentity(Context c) { if (!c.hasCookie(authConfig_.authCookieName())) { return null; } diff --git a/lib/src/main/java/rife/authentication/elements/Logout.java b/lib/src/main/java/rife/authentication/elements/Logout.java index fa7fdefa..535d3570 100644 --- a/lib/src/main/java/rife/authentication/elements/Logout.java +++ b/lib/src/main/java/rife/authentication/elements/Logout.java @@ -70,7 +70,7 @@ public class Logout implements Element { } } - c.removeAttribute(AuthConfig.identityAttributeName()); + c.removeAttribute(authConfig_.identityAttributeName()); loggedOut(template); diff --git a/lib/src/main/java/rife/engine/EngineTemplateProcessor.java b/lib/src/main/java/rife/engine/EngineTemplateProcessor.java index 02c9fc1e..73894e3e 100644 --- a/lib/src/main/java/rife/engine/EngineTemplateProcessor.java +++ b/lib/src/main/java/rife/engine/EngineTemplateProcessor.java @@ -5,6 +5,7 @@ package rife.engine; import rife.authentication.elements.AuthConfig; +import rife.authentication.elements.Identified; import rife.engine.exceptions.EngineException; import rife.template.Template; import rife.template.TemplateEncoder; @@ -127,7 +128,12 @@ class EngineTemplateProcessor { } private void processAuthentication(final List setValues) { - final var identity = AuthConfig.identityAttribute(context_); + var identified = Identified.getIdentifiedElementInRequest(context_); + if (identified == null) { + return; + } + + final var identity = identified.getAuthConfig().identityAttribute(context_); if (identity != null) { final var auth_value_tags = template_.getFilteredValues(TemplateFactoryFilters.TAG_AUTH); final var auth_block_tags = template_.getFilteredBlocks(TemplateFactoryFilters.TAG_AUTH); @@ -140,26 +146,26 @@ class EngineTemplateProcessor { // handle authenticated login blocks assignment if (!template_.isValueSet(auth_value_id)) { - for (var block_groups : auth_login_block_tags) { + for (var block_groups : auth_login_block_tags) { var auth_block_id = block_groups[0]; if (block_groups[1].equals(auth_differentiator) && identity.getLogin().equals(block_groups[2])) { template_.setBlock(auth_value_id, auth_block_id); setValues.add(auth_value_id); } - } + } } // handle authenticated role blocks assignment if (!template_.isValueSet(auth_value_id)) { - for (var block_groups : auth_role_block_tags) { + for (var block_groups : auth_role_block_tags) { var auth_block_id = block_groups[0]; if (block_groups[1].equals(auth_differentiator) && identity.getAttributes().isInRole(block_groups[2])) { template_.setBlock(auth_value_id, auth_block_id); setValues.add(auth_value_id); } - } + } } // handle authenticated blocks assignment diff --git a/lib/src/test/java/rife/authentication/elements/DatabaseAuthenticatedSite.java b/lib/src/test/java/rife/authentication/elements/DatabaseAuthenticatedSite.java index ea91627d..cd6f5d6b 100644 --- a/lib/src/test/java/rife/authentication/elements/DatabaseAuthenticatedSite.java +++ b/lib/src/test/java/rife/authentication/elements/DatabaseAuthenticatedSite.java @@ -61,7 +61,7 @@ public class DatabaseAuthenticatedSite extends Site implements AutoCloseable { landing = get("/landing", c -> c.print("Landing")); logout = get("/logout", new Logout(config, TemplateFactory.HTML.get("authentication.logout"))); template = get("/template", c -> c.print(c.template("filtered_tags_auth"))); - get("/username", c -> c.print(AuthConfig.identityAttribute(c) != null ? AuthConfig.identityAttribute(c).getLogin() : "not logged in")); + get("/username", c -> c.print(config.identityAttribute(c) != null ? config.identityAttribute(c).getLogin() : "not logged in")); group(new Router() { public void setup() { before(new Logout(config)); diff --git a/lib/src/test/java/rife/authentication/elements/MemoryAuthenticatedSite.java b/lib/src/test/java/rife/authentication/elements/MemoryAuthenticatedSite.java index 83d7f173..7aaeaa91 100644 --- a/lib/src/test/java/rife/authentication/elements/MemoryAuthenticatedSite.java +++ b/lib/src/test/java/rife/authentication/elements/MemoryAuthenticatedSite.java @@ -43,7 +43,7 @@ public class MemoryAuthenticatedSite extends Site { landing = get("/landing", c -> c.print("Landing")); logout = get("/logout", new Logout(config, TemplateFactory.HTML.get("authentication.logout"))); template = get("/template", c -> c.print(c.template("filtered_tags_auth"))); - get("/username", c -> c.print(AuthConfig.identityAttribute(c) != null ? AuthConfig.identityAttribute(c).getLogin() : "not logged in")); + get("/username", c -> c.print(config.identityAttribute(c) != null ? config.identityAttribute(c).getLogin() : "not logged in")); group(new Router() { public void setup() { before(new Logout(config));