From 167045c890609e1a245e21a901f2b044c6090f41 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 10 Apr 2020 10:13:57 +0300 Subject: [PATCH] Fixed - Redisson Tomcat Manager doesn't store principal and authType session attributes. #2589 --- .../org/redisson/tomcat/RedissonSession.java | 37 +++++++++- .../org/redisson/tomcat/RedissonSession.java | 37 +++++++++- .../org/redisson/tomcat/RedissonSession.java | 69 +++++++++++++------ 3 files changed, 121 insertions(+), 22 deletions(-) diff --git a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java index fc097ac0b..e94a8de03 100644 --- a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java +++ b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java @@ -24,6 +24,7 @@ import org.redisson.tomcat.RedissonSessionManager.UpdateMode; import java.io.IOException; import java.lang.reflect.Field; +import java.security.Principal; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; @@ -44,6 +45,8 @@ public class RedissonSession extends StandardSession { private static final String LAST_ACCESSED_TIME_ATTR = "session:lastAccessedTime"; private static final String CREATION_TIME_ATTR = "session:creationTime"; private static final String IS_EXPIRATION_LOCKED = "session:isExpirationLocked"; + private static final String PRINCIPAL_ATTR = "session:principal"; + private static final String AUTHTYPE_ATTR = "session:authtype"; public static final Set ATTRS = new HashSet(Arrays.asList( IS_NEW_ATTR, IS_VALID_ATTR, @@ -241,7 +244,25 @@ public class RedissonSession extends StandardSession { } } } - + + @Override + public void setPrincipal(Principal principal) { + super.setPrincipal(principal); + + if (map != null) { + fastPut(PRINCIPAL_ATTR, principal); + } + } + + @Override + public void setAuthType(String authType) { + super.setAuthType(authType); + + if (map != null) { + fastPut(AUTHTYPE_ATTR, authType); + } + } + @Override public void setValid(boolean isValid) { super.setValid(isValid); @@ -326,6 +347,12 @@ public class RedissonSession extends StandardSession { newMap.put(MAX_INACTIVE_INTERVAL_ATTR, maxInactiveInterval); newMap.put(IS_VALID_ATTR, isValid); newMap.put(IS_NEW_ATTR, isNew); + if (principal != null) { + newMap.put(PRINCIPAL_ATTR, principal); + } + if (authType != null) { + newMap.put(AUTHTYPE_ATTR, authType); + } if (broadcastSessionEvents) { newMap.put(IS_EXPIRATION_LOCKED, isExpirationLocked); } @@ -384,6 +411,14 @@ public class RedissonSession extends StandardSession { if (isExpirationLocked != null) { this.isExpirationLocked = isExpirationLocked; } + Principal p = (Principal) attrs.remove(PRINCIPAL_ATTR); + if (p != null) { + this.principal = p; + } + String authType = (String) attrs.remove(AUTHTYPE_ATTR); + if (authType != null) { + this.authType = authType; + } for (Entry entry : attrs.entrySet()) { super.setAttribute(entry.getKey(), entry.getValue(), false); diff --git a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java index fc097ac0b..e94a8de03 100644 --- a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java +++ b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java @@ -24,6 +24,7 @@ import org.redisson.tomcat.RedissonSessionManager.UpdateMode; import java.io.IOException; import java.lang.reflect.Field; +import java.security.Principal; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; @@ -44,6 +45,8 @@ public class RedissonSession extends StandardSession { private static final String LAST_ACCESSED_TIME_ATTR = "session:lastAccessedTime"; private static final String CREATION_TIME_ATTR = "session:creationTime"; private static final String IS_EXPIRATION_LOCKED = "session:isExpirationLocked"; + private static final String PRINCIPAL_ATTR = "session:principal"; + private static final String AUTHTYPE_ATTR = "session:authtype"; public static final Set ATTRS = new HashSet(Arrays.asList( IS_NEW_ATTR, IS_VALID_ATTR, @@ -241,7 +244,25 @@ public class RedissonSession extends StandardSession { } } } - + + @Override + public void setPrincipal(Principal principal) { + super.setPrincipal(principal); + + if (map != null) { + fastPut(PRINCIPAL_ATTR, principal); + } + } + + @Override + public void setAuthType(String authType) { + super.setAuthType(authType); + + if (map != null) { + fastPut(AUTHTYPE_ATTR, authType); + } + } + @Override public void setValid(boolean isValid) { super.setValid(isValid); @@ -326,6 +347,12 @@ public class RedissonSession extends StandardSession { newMap.put(MAX_INACTIVE_INTERVAL_ATTR, maxInactiveInterval); newMap.put(IS_VALID_ATTR, isValid); newMap.put(IS_NEW_ATTR, isNew); + if (principal != null) { + newMap.put(PRINCIPAL_ATTR, principal); + } + if (authType != null) { + newMap.put(AUTHTYPE_ATTR, authType); + } if (broadcastSessionEvents) { newMap.put(IS_EXPIRATION_LOCKED, isExpirationLocked); } @@ -384,6 +411,14 @@ public class RedissonSession extends StandardSession { if (isExpirationLocked != null) { this.isExpirationLocked = isExpirationLocked; } + Principal p = (Principal) attrs.remove(PRINCIPAL_ATTR); + if (p != null) { + this.principal = p; + } + String authType = (String) attrs.remove(AUTHTYPE_ATTR); + if (authType != null) { + this.authType = authType; + } for (Entry entry : attrs.entrySet()) { super.setAttribute(entry.getKey(), entry.getValue(), false); diff --git a/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSession.java b/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSession.java index aa0df098b..e94a8de03 100644 --- a/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSession.java +++ b/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSession.java @@ -15,26 +15,21 @@ */ package org.redisson.tomcat; -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - import org.apache.catalina.session.StandardSession; -import org.redisson.api.RSet; import org.redisson.api.RMap; +import org.redisson.api.RSet; import org.redisson.api.RTopic; import org.redisson.tomcat.RedissonSessionManager.ReadMode; import org.redisson.tomcat.RedissonSessionManager.UpdateMode; +import java.io.IOException; +import java.lang.reflect.Field; +import java.security.Principal; +import java.util.*; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + /** * Redisson Session object for Apache Tomcat * @@ -50,6 +45,8 @@ public class RedissonSession extends StandardSession { private static final String LAST_ACCESSED_TIME_ATTR = "session:lastAccessedTime"; private static final String CREATION_TIME_ATTR = "session:creationTime"; private static final String IS_EXPIRATION_LOCKED = "session:isExpirationLocked"; + private static final String PRINCIPAL_ATTR = "session:principal"; + private static final String AUTHTYPE_ATTR = "session:authtype"; public static final Set ATTRS = new HashSet(Arrays.asList( IS_NEW_ATTR, IS_VALID_ATTR, @@ -63,15 +60,15 @@ public class RedissonSession extends StandardSession { private final Map attrs; private RMap map; private final RTopic topic; - private final RedissonSessionManager.ReadMode readMode; + private final ReadMode readMode; private final UpdateMode updateMode; - + private Set removedAttributes = Collections.emptySet(); private Set updatedAttributes = Collections.emptySet(); - + private final boolean broadcastSessionEvents; - - public RedissonSession(RedissonSessionManager manager, RedissonSessionManager.ReadMode readMode, UpdateMode updateMode, boolean broadcastSessionEvents) { + + public RedissonSession(RedissonSessionManager manager, ReadMode readMode, UpdateMode updateMode, boolean broadcastSessionEvents) { super(manager); this.redissonManager = manager; this.readMode = readMode; @@ -247,7 +244,25 @@ public class RedissonSession extends StandardSession { } } } - + + @Override + public void setPrincipal(Principal principal) { + super.setPrincipal(principal); + + if (map != null) { + fastPut(PRINCIPAL_ATTR, principal); + } + } + + @Override + public void setAuthType(String authType) { + super.setAuthType(authType); + + if (map != null) { + fastPut(AUTHTYPE_ATTR, authType); + } + } + @Override public void setValid(boolean isValid) { super.setValid(isValid); @@ -332,6 +347,12 @@ public class RedissonSession extends StandardSession { newMap.put(MAX_INACTIVE_INTERVAL_ATTR, maxInactiveInterval); newMap.put(IS_VALID_ATTR, isValid); newMap.put(IS_NEW_ATTR, isNew); + if (principal != null) { + newMap.put(PRINCIPAL_ATTR, principal); + } + if (authType != null) { + newMap.put(AUTHTYPE_ATTR, authType); + } if (broadcastSessionEvents) { newMap.put(IS_EXPIRATION_LOCKED, isExpirationLocked); } @@ -390,6 +411,14 @@ public class RedissonSession extends StandardSession { if (isExpirationLocked != null) { this.isExpirationLocked = isExpirationLocked; } + Principal p = (Principal) attrs.remove(PRINCIPAL_ATTR); + if (p != null) { + this.principal = p; + } + String authType = (String) attrs.remove(AUTHTYPE_ATTR); + if (authType != null) { + this.authType = authType; + } for (Entry entry : attrs.entrySet()) { super.setAttribute(entry.getKey(), entry.getValue(), false);