From 5a462b3594664f42b354f2e9c90e75881db6d960 Mon Sep 17 00:00:00 2001 From: Vedran Pavic Date: Fri, 12 Apr 2019 20:08:54 +0200 Subject: [PATCH] Resolve indexes for Hazelcast session on write Resolves: #1145 --- .../hazelcast/HazelcastSessionRepository.java | 39 +++++++++++++++++-- .../hazelcast/PrincipalNameExtractor.java | 38 ++---------------- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/HazelcastSessionRepository.java b/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/HazelcastSessionRepository.java index 0908af97..15455246 100644 --- a/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/HazelcastSessionRepository.java +++ b/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/HazelcastSessionRepository.java @@ -40,6 +40,8 @@ import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; +import org.springframework.expression.Expression; +import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.session.FindByIndexNameSessionRepository; import org.springframework.session.MapSession; import org.springframework.session.Session; @@ -121,11 +123,15 @@ public class HazelcastSessionRepository implements */ public static final String PRINCIPAL_NAME_ATTRIBUTE = "principalName"; + private static final String SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT"; + private static final boolean SUPPORTS_SET_TTL = ClassUtils .hasAtLeastOneMethodWithName(IMap.class, "setTtl"); private static final Log logger = LogFactory.getLog(HazelcastSessionRepository.class); + private static final PrincipalNameResolver principalNameResolver = new PrincipalNameResolver(); + private final HazelcastInstance hazelcastInstance; private ApplicationEventPublisher eventPublisher = new ApplicationEventPublisher() { @@ -427,14 +433,18 @@ public class HazelcastSessionRepository implements public void setAttribute(String attributeName, Object attributeValue) { this.delegate.setAttribute(attributeName, attributeValue); this.delta.put(attributeName, attributeValue); + if (SPRING_SECURITY_CONTEXT.equals(attributeName)) { + String principal = (attributeValue != null) + ? principalNameResolver.resolvePrincipal(this) + : null; + this.delegate.setAttribute(PRINCIPAL_NAME_INDEX_NAME, principal); + } flushImmediateIfNecessary(); } @Override public void removeAttribute(String attributeName) { - this.delegate.removeAttribute(attributeName); - this.delta.put(attributeName, null); - flushImmediateIfNecessary(); + setAttribute(attributeName, null); } MapSession getDelegate() { @@ -462,4 +472,27 @@ public class HazelcastSessionRepository implements } + /** + * Resolves the Spring Security principal name. + */ + static class PrincipalNameResolver { + + private SpelExpressionParser parser = new SpelExpressionParser(); + + public String resolvePrincipal(Session session) { + String principalName = session.getAttribute(PRINCIPAL_NAME_INDEX_NAME); + if (principalName != null) { + return principalName; + } + Object authentication = session.getAttribute(SPRING_SECURITY_CONTEXT); + if (authentication != null) { + Expression expression = this.parser + .parseExpression("authentication?.name"); + return expression.getValue(authentication, String.class); + } + return null; + } + + } + } diff --git a/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/PrincipalNameExtractor.java b/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/PrincipalNameExtractor.java index c2d34011..c1d31309 100644 --- a/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/PrincipalNameExtractor.java +++ b/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/PrincipalNameExtractor.java @@ -19,11 +19,8 @@ package org.springframework.session.hazelcast; import com.hazelcast.query.extractor.ValueCollector; import com.hazelcast.query.extractor.ValueExtractor; -import org.springframework.expression.Expression; -import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.session.FindByIndexNameSessionRepository; import org.springframework.session.MapSession; -import org.springframework.session.Session; /** * Hazelcast {@link ValueExtractor} responsible for extracting principal name from the @@ -34,43 +31,14 @@ import org.springframework.session.Session; */ public class PrincipalNameExtractor extends ValueExtractor { - private static final PrincipalNameResolver PRINCIPAL_NAME_RESOLVER = - new PrincipalNameResolver(); - @Override @SuppressWarnings("unchecked") - public void extract(MapSession target, String argument, - ValueCollector collector) { - String principalName = PRINCIPAL_NAME_RESOLVER.resolvePrincipal(target); + public void extract(MapSession target, String argument, ValueCollector collector) { + String principalName = target + .getAttribute(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME); if (principalName != null) { collector.addObject(principalName); } } - /** - * Resolves the Spring Security principal name. - */ - static class PrincipalNameResolver { - - private static final String SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT"; - - private SpelExpressionParser parser = new SpelExpressionParser(); - - public String resolvePrincipal(Session session) { - String principalName = session.getAttribute( - FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME); - if (principalName != null) { - return principalName; - } - Object authentication = session.getAttribute(SPRING_SECURITY_CONTEXT); - if (authentication != null) { - Expression expression = this.parser - .parseExpression("authentication?.name"); - return expression.getValue(authentication, String.class); - } - return null; - } - - } - }