Compare commits

...

2 Commits

Author SHA1 Message Date
Misagh Moayyed a1b02214af Allow url patterns to be included 2016-09-07 16:35:37 +04:30
Misagh Moayyed dd6d197f79 Allow url patterns to be included 2016-09-07 16:33:00 +04:30
2 changed files with 56 additions and 22 deletions

View File

@ -28,6 +28,7 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import org.jasig.cas.client.Protocol; import org.jasig.cas.client.Protocol;
import org.jasig.cas.client.configuration.ConfigurationKey;
import org.jasig.cas.client.configuration.ConfigurationKeys; import org.jasig.cas.client.configuration.ConfigurationKeys;
import org.jasig.cas.client.util.AbstractCasFilter; import org.jasig.cas.client.util.AbstractCasFilter;
import org.jasig.cas.client.util.CommonUtils; import org.jasig.cas.client.util.CommonUtils;
@ -73,6 +74,8 @@ public class AuthenticationFilter extends AbstractCasFilter {
private UrlPatternMatcherStrategy ignoreUrlPatternMatcherStrategyClass = null; private UrlPatternMatcherStrategy ignoreUrlPatternMatcherStrategyClass = null;
private UrlPatternMatcherStrategy includeUrlPatternMatcherStrategyClass = null;
private static final Map<String, Class<? extends UrlPatternMatcherStrategy>> PATTERN_MATCHER_TYPES = private static final Map<String, Class<? extends UrlPatternMatcherStrategy>> PATTERN_MATCHER_TYPES =
new HashMap<String, Class<? extends UrlPatternMatcherStrategy>>(); new HashMap<String, Class<? extends UrlPatternMatcherStrategy>>();
@ -97,25 +100,11 @@ public class AuthenticationFilter extends AbstractCasFilter {
setRenew(getBoolean(ConfigurationKeys.RENEW)); setRenew(getBoolean(ConfigurationKeys.RENEW));
setGateway(getBoolean(ConfigurationKeys.GATEWAY)); setGateway(getBoolean(ConfigurationKeys.GATEWAY));
final String ignorePattern = getString(ConfigurationKeys.IGNORE_PATTERN); configureUrlPatternMatchers(ConfigurationKeys.IGNORE_PATTERN, ConfigurationKeys.IGNORE_URL_PATTERN_TYPE,
final String ignoreUrlPatternType = getString(ConfigurationKeys.IGNORE_URL_PATTERN_TYPE); this.ignoreUrlPatternMatcherStrategyClass);
if (ignorePattern != null) { configureUrlPatternMatchers(ConfigurationKeys.INCLUDE_PATTERN, ConfigurationKeys.INCLUDE_URL_PATTERN_TYPE,
final Class<? extends UrlPatternMatcherStrategy> ignoreUrlMatcherClass = PATTERN_MATCHER_TYPES.get(ignoreUrlPatternType); this.includeUrlPatternMatcherStrategyClass);
if (ignoreUrlMatcherClass != null) {
this.ignoreUrlPatternMatcherStrategyClass = ReflectUtils.newInstance(ignoreUrlMatcherClass.getName());
} else {
try {
logger.trace("Assuming {} is a qualified class name...", ignoreUrlPatternType);
this.ignoreUrlPatternMatcherStrategyClass = ReflectUtils.newInstance(ignoreUrlPatternType);
} catch (final IllegalArgumentException e) {
logger.error("Could not instantiate class [{}]", ignoreUrlPatternType, e);
}
}
if (this.ignoreUrlPatternMatcherStrategyClass != null) {
this.ignoreUrlPatternMatcherStrategyClass.setPattern(ignorePattern);
}
}
final Class<? extends GatewayResolver> gatewayStorageClass = getClass(ConfigurationKeys.GATEWAY_STORAGE_CLASS); final Class<? extends GatewayResolver> gatewayStorageClass = getClass(ConfigurationKeys.GATEWAY_STORAGE_CLASS);
@ -148,6 +137,12 @@ public class AuthenticationFilter extends AbstractCasFilter {
return; return;
} }
if (!isRequestUrlIncluded(request)) {
logger.debug("Request is not included.");
filterChain.doFilter(request, response);
return;
}
final HttpSession session = request.getSession(false); final HttpSession session = request.getSession(false);
final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null; final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null;
@ -200,6 +195,43 @@ public class AuthenticationFilter extends AbstractCasFilter {
this.gatewayStorage = gatewayStorage; this.gatewayStorage = gatewayStorage;
} }
private void configureUrlPatternMatchers(final ConfigurationKey<String> keyName,
final ConfigurationKey<String> patternTypeKeyName,
final UrlPatternMatcherStrategy urlPatternMatcherStrategy) {
final String pattern = getString(keyName);
final String patternType = getString(patternTypeKeyName);
if (pattern != null) {
final Class<? extends UrlPatternMatcherStrategy> ignoreUrlMatcherClass = PATTERN_MATCHER_TYPES.get(patternType);
if (ignoreUrlMatcherClass != null) {
this.ignoreUrlPatternMatcherStrategyClass = ReflectUtils.newInstance(ignoreUrlMatcherClass.getName());
} else {
try {
logger.trace("Assuming {} is a qualified class name...", patternType);
this.ignoreUrlPatternMatcherStrategyClass = ReflectUtils.newInstance(patternType);
} catch (final IllegalArgumentException e) {
logger.error("Could not instantiate class [{}]", patternType, e);
}
}
if (urlPatternMatcherStrategy != null) {
urlPatternMatcherStrategy.setPattern(pattern);
}
}
}
private boolean isRequestUrlIncluded(final HttpServletRequest request) {
if (this.includeUrlPatternMatcherStrategyClass == null) {
return true;
}
final StringBuffer urlBuffer = request.getRequestURL();
if (request.getQueryString() != null) {
urlBuffer.append("?").append(request.getQueryString());
}
final String requestUri = urlBuffer.toString();
return this.includeUrlPatternMatcherStrategyClass.matches(requestUri);
}
private boolean isRequestUrlExcluded(final HttpServletRequest request) { private boolean isRequestUrlExcluded(final HttpServletRequest request) {
if (this.ignoreUrlPatternMatcherStrategyClass == null) { if (this.ignoreUrlPatternMatcherStrategyClass == null) {
return false; return false;

View File

@ -63,6 +63,8 @@ public interface ConfigurationKeys {
ConfigurationKey<Boolean> DISABLE_XML_SCHEMA_VALIDATION = new ConfigurationKey<Boolean>("disableXmlSchemaValidation", Boolean.FALSE); ConfigurationKey<Boolean> DISABLE_XML_SCHEMA_VALIDATION = new ConfigurationKey<Boolean>("disableXmlSchemaValidation", Boolean.FALSE);
ConfigurationKey<String> IGNORE_PATTERN = new ConfigurationKey<String>("ignorePattern", null); ConfigurationKey<String> IGNORE_PATTERN = new ConfigurationKey<String>("ignorePattern", null);
ConfigurationKey<String> IGNORE_URL_PATTERN_TYPE = new ConfigurationKey<String>("ignoreUrlPatternType", "REGEX"); ConfigurationKey<String> IGNORE_URL_PATTERN_TYPE = new ConfigurationKey<String>("ignoreUrlPatternType", "REGEX");
ConfigurationKey<String> INCLUDE_PATTERN = new ConfigurationKey<String>("includePattern", null);
ConfigurationKey<String> INCLUDE_URL_PATTERN_TYPE = new ConfigurationKey<String>("includeUrlPatternType", "REGEX");
ConfigurationKey<Class<? extends HostnameVerifier>> HOSTNAME_VERIFIER = new ConfigurationKey<Class<? extends HostnameVerifier>>("hostnameVerifier", null); ConfigurationKey<Class<? extends HostnameVerifier>> HOSTNAME_VERIFIER = new ConfigurationKey<Class<? extends HostnameVerifier>>("hostnameVerifier", null);
ConfigurationKey<String> HOSTNAME_VERIFIER_CONFIG = new ConfigurationKey<String>("hostnameVerifierConfig", null); ConfigurationKey<String> HOSTNAME_VERIFIER_CONFIG = new ConfigurationKey<String>("hostnameVerifierConfig", null);
ConfigurationKey<Boolean> EXCEPTION_ON_VALIDATION_FAILURE = new ConfigurationKey<Boolean>("exceptionOnValidationFailure", Boolean.TRUE); ConfigurationKey<Boolean> EXCEPTION_ON_VALIDATION_FAILURE = new ConfigurationKey<Boolean>("exceptionOnValidationFailure", Boolean.TRUE);