package org.apereo.cas.services;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apereo.cas.authentication.principal.PersistentIdGenerator;
import org.apereo.cas.authentication.principal.Service;
import org.apereo.cas.authentication.principal.ShibbolethCompatiblePersistentIdGenerator;
import org.apereo.cas.authentication.principal.Principal;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Generates a persistent id as username for anonymous service access.
* By default, the generation is handled by
* {@link ShibbolethCompatiblePersistentIdGenerator}.
* Generated ids are unique per service.
*
* @author Misagh Moayyed
* @since 4.1.0
*/
public class AnonymousRegisteredServiceUsernameAttributeProvider implements RegisteredServiceUsernameAttributeProvider {
private static final long serialVersionUID = 7050462900237284803L;
private static final Logger LOGGER = LoggerFactory.getLogger(AnonymousRegisteredServiceUsernameAttributeProvider.class);
/**
* Encoder to generate PseudoIds.
*/
private PersistentIdGenerator persistentIdGenerator =
new ShibbolethCompatiblePersistentIdGenerator(RandomStringUtils.randomAlphanumeric(16));
/**
* Init provider.
*/
public AnonymousRegisteredServiceUsernameAttributeProvider() {
}
/**
* Instantiates a new default registered service username provider.
*
* @param persistentIdGenerator the persistent id generator
*/
public AnonymousRegisteredServiceUsernameAttributeProvider(final PersistentIdGenerator persistentIdGenerator) {
this.persistentIdGenerator = persistentIdGenerator;
}
public PersistentIdGenerator getPersistentIdGenerator() {
return this.persistentIdGenerator;
}
@Override
public String resolveUsername(final Principal principal, final Service service, final RegisteredService registeredService) {
if (this.persistentIdGenerator == null) {
throw new IllegalArgumentException("No persistent id generator is defined");
}
final String id = this.persistentIdGenerator.generate(principal, service);
LOGGER.debug("Resolved username [{}] for anonymous access", id);
return id;
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
final AnonymousRegisteredServiceUsernameAttributeProvider rhs = (AnonymousRegisteredServiceUsernameAttributeProvider) obj;
return this.persistentIdGenerator.equals(rhs.persistentIdGenerator);
}
@Override
public int hashCode() {
return new HashCodeBuilder(13, 113).toHashCode();
}
}