package fr.openwide.core.jpa.security.runas;
import java.util.Collection;
import java.util.List;
import org.springframework.security.access.intercept.RunAsImplAuthenticationProvider;
import org.springframework.security.access.intercept.RunAsUserToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import fr.openwide.core.jpa.security.business.authority.util.CoreAuthorityConstants;
import fr.openwide.core.jpa.security.util.UserConstants;
/**
* Implémentation de {@link Authentication} permettant de faire tourner des tâches
* systèmes sous une authentification propre et privilégiée.
*/
public class RunAsSystemToken extends RunAsUserToken {
private static final long serialVersionUID = -5388947732896720161L;
/**
* Liste des autorités de l'authentication
*/
protected static final List<? extends GrantedAuthority> SYSTEM_AUTHORITIES = Lists.newArrayList(
new SimpleGrantedAuthority(CoreAuthorityConstants.ROLE_SYSTEM)
);
/**
* Construction d'un nouveau jeton système
*
* @param runAsKey clé à utiliser. Pour que l'authentification soit réussie, il faut que cette clé
* corresponde à celle configurée sur le bean {@link RunAsImplAuthenticationProvider}
* @param principal identifiant lié à l'{@link Authentication}
* @param credentials mot de passe lié à l'{@link Authentication}
*/
public RunAsSystemToken(String runAsKey, String principal, Collection<? extends GrantedAuthority> additionalAuthorities) {
super(runAsKey, principal, UserConstants.NO_CREDENTIALS,
Sets.newHashSet(Iterables.concat(SYSTEM_AUTHORITIES, additionalAuthorities)),
Authentication.class);
setAuthenticated(true);
}
@Override
public Object getDetails() {
return null;
}
}