package com.hwlcn.security.subject.support;
import com.hwlcn.security.SecurityUtils;
import com.hwlcn.security.UnavailableSecurityManagerException;
import com.hwlcn.security.authc.AuthenticationInfo;
import com.hwlcn.security.authc.AuthenticationToken;
import com.hwlcn.security.authc.HostAuthenticationToken;
import com.hwlcn.security.mgt.SecurityManager;
import com.hwlcn.security.session.Session;
import com.hwlcn.security.subject.PrincipalCollection;
import com.hwlcn.security.subject.Subject;
import com.hwlcn.security.subject.SubjectContext;
import com.hwlcn.security.util.CollectionUtils;
import com.hwlcn.security.util.MapContext;
import com.hwlcn.security.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
public class DefaultSubjectContext extends MapContext implements SubjectContext {
private static final String SECURITY_MANAGER = DefaultSubjectContext.class.getName() + ".SECURITY_MANAGER";
private static final String SESSION_ID = DefaultSubjectContext.class.getName() + ".SESSION_ID";
private static final String AUTHENTICATION_TOKEN = DefaultSubjectContext.class.getName() + ".AUTHENTICATION_TOKEN";
private static final String AUTHENTICATION_INFO = DefaultSubjectContext.class.getName() + ".AUTHENTICATION_INFO";
private static final String SUBJECT = DefaultSubjectContext.class.getName() + ".SUBJECT";
private static final String PRINCIPALS = DefaultSubjectContext.class.getName() + ".PRINCIPALS";
private static final String SESSION = DefaultSubjectContext.class.getName() + ".SESSION";
private static final String AUTHENTICATED = DefaultSubjectContext.class.getName() + ".AUTHENTICATED";
private static final String HOST = DefaultSubjectContext.class.getName() + ".HOST";
public static final String SESSION_CREATION_ENABLED = DefaultSubjectContext.class.getName() + ".SESSION_CREATION_ENABLED";
public static final String PRINCIPALS_SESSION_KEY = DefaultSubjectContext.class.getName() + "_PRINCIPALS_SESSION_KEY";
public static final String AUTHENTICATED_SESSION_KEY = DefaultSubjectContext.class.getName() + "_AUTHENTICATED_SESSION_KEY";
private static final transient Logger log = LoggerFactory.getLogger(DefaultSubjectContext.class);
public DefaultSubjectContext() {
super();
}
public DefaultSubjectContext(SubjectContext ctx) {
super(ctx);
}
public SecurityManager getSecurityManager() {
return getTypedValue(SECURITY_MANAGER, SecurityManager.class);
}
public void setSecurityManager(SecurityManager securityManager) {
nullSafePut(SECURITY_MANAGER, securityManager);
}
public SecurityManager resolveSecurityManager() {
SecurityManager securityManager = getSecurityManager();
if (securityManager == null) {
if (log.isDebugEnabled()) {
log.debug("No SecurityManager available in subject context map. " +
"Falling back to SecurityUtils.getSecurityManager() lookup.");
}
try {
securityManager = SecurityUtils.getSecurityManager();
} catch (UnavailableSecurityManagerException e) {
if (log.isDebugEnabled()) {
log.debug("No SecurityManager available via SecurityUtils. Heuristics exhausted.", e);
}
}
}
return securityManager;
}
public Serializable getSessionId() {
return getTypedValue(SESSION_ID, Serializable.class);
}
public void setSessionId(Serializable sessionId) {
nullSafePut(SESSION_ID, sessionId);
}
public Subject getSubject() {
return getTypedValue(SUBJECT, Subject.class);
}
public void setSubject(Subject subject) {
nullSafePut(SUBJECT, subject);
}
public PrincipalCollection getPrincipals() {
return getTypedValue(PRINCIPALS, PrincipalCollection.class);
}
public void setPrincipals(PrincipalCollection principals) {
if (!CollectionUtils.isEmpty(principals)) {
put(PRINCIPALS, principals);
}
}
public PrincipalCollection resolvePrincipals() {
PrincipalCollection principals = getPrincipals();
if (CollectionUtils.isEmpty(principals)) {
AuthenticationInfo info = getAuthenticationInfo();
if (info != null) {
principals = info.getPrincipals();
}
}
if (CollectionUtils.isEmpty(principals)) {
Subject subject = getSubject();
if (subject != null) {
principals = subject.getPrincipals();
}
}
if (CollectionUtils.isEmpty(principals)) {
Session session = resolveSession();
if (session != null) {
principals = (PrincipalCollection) session.getAttribute(PRINCIPALS_SESSION_KEY);
}
}
return principals;
}
public Session getSession() {
return getTypedValue(SESSION, Session.class);
}
public void setSession(Session session) {
nullSafePut(SESSION, session);
}
public Session resolveSession() {
Session session = getSession();
if (session == null) {
Subject existingSubject = getSubject();
if (existingSubject != null) {
session = existingSubject.getSession(false);
}
}
return session;
}
public boolean isSessionCreationEnabled() {
Boolean val = getTypedValue(SESSION_CREATION_ENABLED, Boolean.class);
return val == null || val;
}
public void setSessionCreationEnabled(boolean enabled) {
nullSafePut(SESSION_CREATION_ENABLED, enabled);
}
public boolean isAuthenticated() {
Boolean authc = getTypedValue(AUTHENTICATED, Boolean.class);
return authc != null && authc;
}
public void setAuthenticated(boolean authc) {
put(AUTHENTICATED, authc);
}
public boolean resolveAuthenticated() {
Boolean authc = getTypedValue(AUTHENTICATED, Boolean.class);
if (authc == null) {
AuthenticationInfo info = getAuthenticationInfo();
authc = info != null;
}
if (!authc) {
Session session = resolveSession();
if (session != null) {
Boolean sessionAuthc = (Boolean) session.getAttribute(AUTHENTICATED_SESSION_KEY);
authc = sessionAuthc != null && sessionAuthc;
}
}
return authc;
}
public AuthenticationInfo getAuthenticationInfo() {
return getTypedValue(AUTHENTICATION_INFO, AuthenticationInfo.class);
}
public void setAuthenticationInfo(AuthenticationInfo info) {
nullSafePut(AUTHENTICATION_INFO, info);
}
public AuthenticationToken getAuthenticationToken() {
return getTypedValue(AUTHENTICATION_TOKEN, AuthenticationToken.class);
}
public void setAuthenticationToken(AuthenticationToken token) {
nullSafePut(AUTHENTICATION_TOKEN, token);
}
public String getHost() {
return getTypedValue(HOST, String.class);
}
public void setHost(String host) {
if (StringUtils.hasText(host)) {
put(HOST, host);
}
}
public String resolveHost() {
String host = getHost();
if (host == null) {
AuthenticationToken token = getAuthenticationToken();
if (token instanceof HostAuthenticationToken) {
host = ((HostAuthenticationToken) token).getHost();
}
}
if (host == null) {
Session session = resolveSession();
if (session != null) {
host = session.getHost();
}
}
return host;
}
}