提交 ac05680b 编写于 作者: J Jesse Glick 提交者: Oleg Nenashev

Introduced ACL.lambda convenience method (#3260)

* Introduced ACL.lambda convenience method.

* Javadoc
上级 f1fc0f02
...@@ -977,14 +977,10 @@ public class User extends AbstractModelObject implements AccessControlled, Descr ...@@ -977,14 +977,10 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
} }
public ACL getACL() { public ACL getACL() {
final ACL base = Jenkins.getInstance().getAuthorizationStrategy().getACL(this); ACL base = Jenkins.getInstance().getAuthorizationStrategy().getACL(this);
// always allow a non-anonymous user full control of himself. // always allow a non-anonymous user full control of himself.
return new ACL() { return ACL.lambda((a, permission) -> (idStrategy().equals(a.getName(), id) && !(a instanceof AnonymousAuthenticationToken))
public boolean hasPermission(Authentication a, Permission permission) { || base.hasPermission(a, permission));
return (idStrategy().equals(a.getName(), id) && !(a instanceof AnonymousAuthenticationToken))
|| base.hasPermission(a, permission);
}
};
} }
/** /**
......
...@@ -34,6 +34,7 @@ import hudson.model.Item; ...@@ -34,6 +34,7 @@ import hudson.model.Item;
import hudson.remoting.Callable; import hudson.remoting.Callable;
import hudson.model.ItemGroup; import hudson.model.ItemGroup;
import hudson.model.TopLevelItemDescriptor; import hudson.model.TopLevelItemDescriptor;
import java.util.function.BiFunction;
import jenkins.security.NonSerializableSecurityContext; import jenkins.security.NonSerializableSecurityContext;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import jenkins.security.NotReallyRoleSensitiveCallable; import jenkins.security.NotReallyRoleSensitiveCallable;
...@@ -95,6 +96,21 @@ public abstract class ACL { ...@@ -95,6 +96,21 @@ public abstract class ACL {
*/ */
public abstract boolean hasPermission(@Nonnull Authentication a, @Nonnull Permission permission); public abstract boolean hasPermission(@Nonnull Authentication a, @Nonnull Permission permission);
/**
* Creates a simple {@link ACL} implementation based on a “single-abstract-method” easily implemented via lambda syntax.
* @param impl the implementation of {@link ACL#hasPermission(Authentication, Permission)}
* @return an adapter to that lambda
* @since FIXME
*/
public static ACL lambda(final BiFunction<Authentication, Permission, Boolean> impl) {
return new ACL() {
@Override
public boolean hasPermission(Authentication a, Permission permission) {
return impl.apply(a, permission);
}
};
}
/** /**
* Checks if the current security principal has the permission to create top level items within the specified * Checks if the current security principal has the permission to create top level items within the specified
* item group. * item group.
......
...@@ -95,9 +95,7 @@ public abstract class AuthorizationStrategy extends AbstractDescribableImpl<Auth ...@@ -95,9 +95,7 @@ public abstract class AuthorizationStrategy extends AbstractDescribableImpl<Auth
* @since 1.220 * @since 1.220
*/ */
public @Nonnull ACL getACL(final @Nonnull View item) { public @Nonnull ACL getACL(final @Nonnull View item) {
return new ACL() { return ACL.lambda((a, permission) -> {
@Override
public boolean hasPermission(Authentication a, Permission permission) {
ACL base = item.getOwner().getACL(); ACL base = item.getOwner().getACL();
boolean hasPermission = base.hasPermission(a, permission); boolean hasPermission = base.hasPermission(a, permission);
...@@ -106,8 +104,7 @@ public abstract class AuthorizationStrategy extends AbstractDescribableImpl<Auth ...@@ -106,8 +104,7 @@ public abstract class AuthorizationStrategy extends AbstractDescribableImpl<Auth
} }
return hasPermission; return hasPermission;
} });
};
} }
/** /**
...@@ -225,12 +222,7 @@ public abstract class AuthorizationStrategy extends AbstractDescribableImpl<Auth ...@@ -225,12 +222,7 @@ public abstract class AuthorizationStrategy extends AbstractDescribableImpl<Auth
return Collections.emptySet(); return Collections.emptySet();
} }
private static final ACL UNSECURED_ACL = new ACL() { private static final ACL UNSECURED_ACL = ACL.lambda((a, p) -> true);
@Override
public boolean hasPermission(Authentication a, Permission permission) {
return true;
}
};
@Extension @Symbol("unsecured") @Extension @Symbol("unsecured")
public static final class DescriptorImpl extends Descriptor<AuthorizationStrategy> { public static final class DescriptorImpl extends Descriptor<AuthorizationStrategy> {
......
...@@ -45,11 +45,7 @@ public class TaskActionTest { ...@@ -45,11 +45,7 @@ public class TaskActionTest {
} }
protected ACL getACL() { protected ACL getACL() {
return new ACL() { return ACL.lambda((a, p) -> true);
public boolean hasPermission(Authentication a, Permission permission) {
return true;
}
};
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册