Gerrit 2.11.3插件REST接口权限控制及公开配置咨询
嘿,针对你在Gerrit 2.11.3插件开发中碰到的这两个权限配置问题,我给你梳理下具体的解决方案:
1. 自定义REST动作的所需权限
Gerrit默认给BranchResource关联的REST动作绑定了write权限,要自定义权限有两种常用方式,根据你的需求选就行:
方式一:在路由配置时直接指定权限
如果只是想替换为Gerrit内置的权限(比如read、create等),可以在RestApiModule的配置里,给post调用链式添加withPermission方法,直接指定所需权限:
install(new RestApiModule() { protected void configure() { post(BranchResource.BRANCH_KIND, "my-cool-action") .to(MyCoolAction.class) .withPermission(ProjectPermission.READ); // 替换成你需要的内置权限 ... } });
方式二:在Action类中手动实现复杂权限检查
如果你的权限逻辑比较特殊(比如自定义插件权限、分支级别的精细控制),可以在MyCoolAction类里注入PermissionBackend,手动编写权限校验逻辑。假设你的类实现了RestModifyView<BranchResource, Input>,代码示例如下:
public class MyCoolAction implements RestModifyView<BranchResource, MyCoolAction.Input> { private final PermissionBackend permissionBackend; // 通过依赖注入获取PermissionBackend实例 @Inject public MyCoolAction(PermissionBackend permissionBackend) { this.permissionBackend = permissionBackend; } @Override public Response apply(BranchResource rsrc, Input input) throws AuthException, IOException { // 自定义权限检查:比如校验当前用户对目标分支有"my-custom-permission"权限 permissionBackend.currentUser() .project(rsrc.getProject()) .ref(rsrc.getBranchKey()) .check("my-custom-permission"); // 替换为你的自定义权限名 // 这里写你的业务逻辑代码 return Response.ok().build(); } // 定义接口输入参数 public static class Input { // 按需添加参数字段 } }
2. 将动作设置为PUBLIC,允许无需认证且不使用"/a/"路径调用
要实现无认证访问且去掉/a/前缀,需要做两个关键配置:
步骤一:使用PublicRestApiModule注册路由
Gerrit的/a/路径是需要身份认证的专属路由,公开接口需要注册到PublicRestApiModule,这样接口会绑定到根路径下:
install(new PublicRestApiModule() { protected void configure() { post(BranchResource.BRANCH_KIND, "my-cool-action").to(MyCoolAction.class); ... } });
步骤二:允许匿名用户访问
在你的MyCoolAction类上添加@AllowAnonymous注解,明确允许匿名用户调用该接口:
@AllowAnonymous public class MyCoolAction implements RestModifyView<BranchResource, MyCoolAction.Input> { @Override public Response apply(BranchResource rsrc, Input input) throws IOException { // 公开接口的业务逻辑,这里不需要权限校验(如果需要基础控制可以手动判断用户身份) return Response.ok().build(); } public static class Input { // 输入参数定义 } }
注意:如果需要对公开接口做简单的访问限制(比如只允许特定IP的匿名用户),可以在apply方法里通过rsrc.getControl().getUser().isAnonymous()判断用户身份,再添加相应的校验逻辑。
此时调用接口的路径就变成了:
http://localhost:8080/projects/TestProject/branches/master/my-plugin~my-cool-action
不需要加/a/前缀,也无需认证就能访问。
内容的提问来源于stack exchange,提问作者Boris Brodski
相关产品推荐
相关产品推荐

