mirror of
https://github.com/ethauvin/rife2.git
synced 2025-05-01 02:58:12 -07:00
Added logout element.
Improved support for path-based route resolving, now also taking super classes into account.
This commit is contained in:
parent
9ae3bb7148
commit
ddfea1d1d0
7 changed files with 153 additions and 19 deletions
|
@ -14,8 +14,11 @@ public class HelloAuthentication extends Site {
|
||||||
final MemorySessionValidator validator = new MemorySessionValidator();
|
final MemorySessionValidator validator = new MemorySessionValidator();
|
||||||
final AuthenticationConfig config = new AuthenticationConfig(validator);
|
final AuthenticationConfig config = new AuthenticationConfig(validator);
|
||||||
|
|
||||||
static class AuthenticatedSection extends Router {
|
class AuthenticatedSection extends Router {
|
||||||
final Route hello = get("/hello", c -> c.print("Hello World"));
|
Route hello = get("/hello", c -> {
|
||||||
|
c.print(c.template("HelloAuthenticated"));
|
||||||
|
});
|
||||||
|
Route logout = get("/logout", new Logout(config, TemplateFactory.HTML.get("HelloLogout")));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setup() {
|
public void setup() {
|
||||||
|
|
6
app/src/main/resources/templates/HelloAuthenticated.html
Normal file
6
app/src/main/resources/templates/HelloAuthenticated.html
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<html lang="en">
|
||||||
|
<body>
|
||||||
|
<p>Hello authenticated!</p>
|
||||||
|
<p><a href="{{v route:logout/}}">Log out</a></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
5
app/src/main/resources/templates/HelloLogout.html
Normal file
5
app/src/main/resources/templates/HelloLogout.html
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<html lang="en">
|
||||||
|
<body>
|
||||||
|
<p>Logged out</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -4,9 +4,7 @@
|
||||||
*/
|
*/
|
||||||
package rife.authentication.elements;
|
package rife.authentication.elements;
|
||||||
|
|
||||||
import rife.authentication.credentialsmanagers.IdentifiableUsersManager;
|
import rife.authentication.credentialsmanagers.*;
|
||||||
import rife.authentication.credentialsmanagers.RoleUserAttributes;
|
|
||||||
import rife.authentication.credentialsmanagers.RoleUserIdentity;
|
|
||||||
import rife.engine.Context;
|
import rife.engine.Context;
|
||||||
import rife.engine.Element;
|
import rife.engine.Element;
|
||||||
|
|
||||||
|
|
88
lib/src/main/java/rife/authentication/elements/Logout.java
Normal file
88
lib/src/main/java/rife/authentication/elements/Logout.java
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2001-2022 Geert Bevin (gbevin[remove] at uwyn dot com)
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License")
|
||||||
|
*/
|
||||||
|
package rife.authentication.elements;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.Cookie;
|
||||||
|
import rife.authentication.elements.exceptions.UndefinedLogoutRememberManagerException;
|
||||||
|
import rife.engine.Context;
|
||||||
|
import rife.engine.Element;
|
||||||
|
import rife.template.Template;
|
||||||
|
|
||||||
|
public class Logout implements Element {
|
||||||
|
protected final AuthenticationConfig authConfig_;
|
||||||
|
protected final Template template_;
|
||||||
|
|
||||||
|
public Logout(AuthenticationConfig config, Template template) {
|
||||||
|
authConfig_ = config;
|
||||||
|
template_ = template;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void initializeLogout() {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void entrance(Template template) {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void loggedOut(Template template) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void process(Context c)
|
||||||
|
throws Exception {
|
||||||
|
initializeLogout();
|
||||||
|
|
||||||
|
final Template template;
|
||||||
|
if (template_ == null) {
|
||||||
|
template = null;
|
||||||
|
} else {
|
||||||
|
template = (Template) template_.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
entrance(template);
|
||||||
|
|
||||||
|
String authid = null;
|
||||||
|
var auth_cookie_name = authConfig_.authCookieName();
|
||||||
|
if (c.hasCookie(authConfig_.authCookieName())) {
|
||||||
|
var auth_cookie = c.cookie(auth_cookie_name);
|
||||||
|
authid = auth_cookie.getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (authid != null) {
|
||||||
|
authConfig_.sessionValidator().getSessionManager().eraseSession(authid);
|
||||||
|
|
||||||
|
// clear remember cookie for the user
|
||||||
|
if (c.hasCookie(authConfig_.rememberCookieName())) {
|
||||||
|
if (null == authConfig_.sessionValidator().getRememberManager()) {
|
||||||
|
throw new UndefinedLogoutRememberManagerException();
|
||||||
|
}
|
||||||
|
|
||||||
|
var remember_cookie_name = authConfig_.rememberCookieName();
|
||||||
|
authConfig_.sessionValidator().getRememberManager().eraseRememberId(c.cookieValue(remember_cookie_name));
|
||||||
|
|
||||||
|
var remember_cookie = c.cookie(remember_cookie_name);
|
||||||
|
remember_cookie.setMaxAge(-1);
|
||||||
|
remember_cookie.setPath("/");
|
||||||
|
remember_cookie.setValue("");
|
||||||
|
c.cookie(remember_cookie);
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear the authentication cookie
|
||||||
|
if (c.hasCookie(auth_cookie_name)) {
|
||||||
|
var cookie = c.cookie(auth_cookie_name);
|
||||||
|
cookie.setMaxAge(-1);
|
||||||
|
cookie.setPath("/");
|
||||||
|
cookie.setValue("");
|
||||||
|
c.cookie(cookie);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.removeAttribute(authConfig_.identityAttributeName());
|
||||||
|
|
||||||
|
loggedOut(template);
|
||||||
|
|
||||||
|
if (template != null) {
|
||||||
|
c.print(template);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2001-2022 Geert Bevin (gbevin[remove] at uwyn dot com)
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License")
|
||||||
|
*/
|
||||||
|
package rife.authentication.elements.exceptions;
|
||||||
|
|
||||||
|
import rife.engine.exceptions.EngineException;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
public class UndefinedLogoutRememberManagerException extends EngineException {
|
||||||
|
@Serial private static final long serialVersionUID = 2230068458914504593L;
|
||||||
|
|
||||||
|
public UndefinedLogoutRememberManagerException() {
|
||||||
|
super("The RememberManager is null, maybe this type of logout element doesn't support remember Remember Me functionalities.");
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
package rife.engine;
|
package rife.engine;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
@ -223,12 +224,29 @@ public class Router {
|
||||||
router = router.parent_;
|
router = router.parent_;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Class klass = router.getClass();
|
||||||
|
Field field = null;
|
||||||
|
while (field == null && klass != Site.class && klass != Router.class) {
|
||||||
try {
|
try {
|
||||||
var field = router.getClass().getDeclaredField(token);
|
field = klass.getDeclaredField(token);
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
|
|
||||||
if (!Modifier.isStatic(field.getModifiers()) &&
|
if (Modifier.isStatic(field.getModifiers()) ||
|
||||||
!Modifier.isTransient(field.getModifiers())) {
|
Modifier.isTransient(field.getModifiers()) ||
|
||||||
|
(!Route.class.isAssignableFrom(field.getType()) && !Router.class.isAssignableFrom(field.getType()))) {
|
||||||
|
field = null;
|
||||||
|
}
|
||||||
|
} catch (NoSuchFieldException ignored) {
|
||||||
|
}
|
||||||
|
|
||||||
|
klass = klass.getSuperclass();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
if (Route.class.isAssignableFrom(field.getType())) {
|
if (Route.class.isAssignableFrom(field.getType())) {
|
||||||
if (route != null) {
|
if (route != null) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -237,8 +255,7 @@ public class Router {
|
||||||
} else if (Router.class.isAssignableFrom(field.getType())) {
|
} else if (Router.class.isAssignableFrom(field.getType())) {
|
||||||
router = (Router) field.get(router);
|
router = (Router) field.get(router);
|
||||||
}
|
}
|
||||||
}
|
} catch (IllegalAccessException e) {
|
||||||
} catch (IllegalAccessException | NoSuchFieldException e) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue