
hudson.security.AuthorizationStrategy Maven / Gradle / Ivy
package hudson.security;
import hudson.ExtensionPoint;
import hudson.model.AbstractItem;
import hudson.model.AbstractProject;
import hudson.model.Computer;
import hudson.model.Describable;
import hudson.model.Descriptor;
import hudson.model.Hudson;
import hudson.model.User;
import hudson.model.View;
import hudson.util.DescriptorList;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import net.sf.json.JSONObject;
import org.acegisecurity.Authentication;
import org.kohsuke.stapler.StaplerRequest;
/**
* Controls authorization throughout Hudson.
*
* Persistence
*
* This object will be persisted along with {@link Hudson} object.
* Hudson by itself won't put the ACL returned from {@link #getRootACL()} into the serialized object graph,
* so if that object contains state and needs to be persisted, it's the responsibility of
* {@link AuthorizationStrategy} to do so (by keeping them in an instance field.)
*
*
Re-configuration
*
* The corresponding {@link Describable} instance will be asked to create a new {@link AuthorizationStrategy}
* every time the system configuration is updated. Implementations that keep more state in ACL beyond
* the system configuration should use {@link Hudson#getAuthorizationStrategy()} to talk to the current
* instance to carry over the state.
*
* @author Kohsuke Kawaguchi
* @see SecurityRealm
*/
public abstract class AuthorizationStrategy implements Describable, ExtensionPoint {
/**
* Returns the instance of {@link ACL} where all the other {@link ACL} instances
* for all the other model objects eventually delegate.
*
* IOW, this ACL will have the ultimate say on the access control.
*/
public abstract ACL getRootACL();
public ACL getACL(AbstractProject,?> project) {
return getRootACL();
}
/**
* Implementation can choose to provide different ACL for different views.
* This can be used as a basis for more fine-grained access control.
*
*
* The default implementation returns {@link #getRootACL()}.
*
* @since 1.220
*/
public ACL getACL(View item) {
return getRootACL();
}
/**
* Implementation can choose to provide different ACL for different items.
* This can be used as a basis for more fine-grained access control.
*
*
* The default implementation returns {@link #getRootACL()}.
*
* @since 1.220
*/
public ACL getACL(AbstractItem item) {
return getRootACL();
}
/**
* Implementation can choose to provide different ACL per user.
* This can be used as a basis for more fine-grained access control.
*
*
* The default implementation returns {@link #getRootACL()}.
*
* @since 1.221
*/
public ACL getACL(User user) {
return getRootACL();
}
/**
* Implementation can choose to provide different ACL for different computers.
* This can be used as a basis for more fine-grained access control.
*
*
* The default implementation returns {@link #getRootACL()}.
*
* @since 1.220
*/
public ACL getACL(Computer computer) {
return getRootACL();
}
/**
* Returns the list of all group/role names used in this authorization strategy,
* and the ACL returned from the {@link #getRootACL()} method.
*
* This method is used by {@link ContainerAuthentication} to work around the servlet API issue
* that prevents us from enumerating roles that the user has.
*
* @return
* never null.
*/
public abstract Collection getGroups();
/**
* All registered {@link SecurityRealm} implementations.
*/
public static final DescriptorList LIST = new DescriptorList();
/**
* {@link AuthorizationStrategy} that implements the semantics
* of unsecured Hudson where everyone has full control.
*/
public static final AuthorizationStrategy UNSECURED = new Unsecured();
private static final class Unsecured extends AuthorizationStrategy implements Serializable {
/**
* Maintains the singleton semantics.
*/
private Object readResolve() {
return UNSECURED;
}
public Descriptor getDescriptor() {
return DESCRIPTOR;
}
@Override
public ACL getRootACL() {
return UNSECURED_ACL;
}
public Collection getGroups() {
return Collections.emptySet();
}
private static final ACL UNSECURED_ACL = new ACL() {
public boolean hasPermission(Authentication a, Permission permission) {
return true;
}
};
private static final Descriptor DESCRIPTOR = new Descriptor(Unsecured.class) {
public String getDisplayName() {
return Messages.AuthorizationStrategy_DisplayName();
}
public AuthorizationStrategy newInstance(StaplerRequest req, JSONObject formData) throws FormException {
return UNSECURED;
}
public String getHelpFile() {
return "/help/security/no-authorization.html";
}
};
static {
LIST.load(FullControlOnceLoggedInAuthorizationStrategy.class);
LIST.load(GlobalMatrixAuthorizationStrategy.class);
LIST.load(LegacyAuthorizationStrategy.class);
LIST.load(ProjectMatrixAuthorizationStrategy.class);
// can't do this in the constructor due to the initialization order
LIST.add(Unsecured.DESCRIPTOR);
}
}
}