-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Open
Labels
status: waiting-for-triageAn issue we've not yet triagedAn issue we've not yet triagedtype: enhancementA general enhancementA general enhancement
Description
public interface SessionAttributeCompressor<T> {
boolean accepts(String attributeName);
T compress(Object attributeValue);
Object uncompress(T serializedAttributeValue);
}then we can compress spring security SecurityContext to username
import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
import org.springframework.util.StringUtils;
@RequiredArgsConstructor
public class SecurityContextSessionAttributeCompressor implements SessionAttributeCompressor<String> {
private final UserDetailsService userDetailsService;
@Override
public boolean accepts(String attributeName) {
return HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY.equals(attributeName);
}
@Override
public String compress(Object securityContext) {
SecurityContext sc = (SecurityContext) securityContext;
if (sc == null || sc.getAuthentication() == null) {
return null;
}
return sc.getAuthentication().getName();
}
@Override
public Object uncompress(String compressedSecurityContext) {
SecurityContext sc = SecurityContextHolder.getContext();
if (StringUtils.hasLength(compressedSecurityContext)) {
UserDetails ud = this.userDetailsService.loadUserByUsername(compressedSecurityContext);
Authentication auth = new UsernamePasswordAuthenticationToken(ud, ud.getPassword(), ud.getAuthorities());
sc.setAuthentication(auth);
}
return sc;
}
}Two advantages:
- Minified serialized session
- Avoid stale state of
UserDetails, currentlyUserDetailsin session is not synchronized withUserDetailsService, session is valid even if user is deleted.
Metadata
Metadata
Assignees
Labels
status: waiting-for-triageAn issue we've not yet triagedAn issue we've not yet triagedtype: enhancementA general enhancementA general enhancement