diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CertAuditCapabilityVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CertAuditCapabilityVO.java index 67ba55fb..7b71e537 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CertAuditCapabilityVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CertAuditCapabilityVO.java @@ -34,8 +34,8 @@ import java.io.Serializable; /** * 认证审核能力 *
- * 小程序端进入审核页前先取它决定空态与按钮禁用。没有权限时两个字段为 false, - * 而不是让接口返回 403——列表与详情各自仍挂权限表达式,这里只回答「能不能」。 + * 无权限时两个字段为 false;本接口不挂权限表达式。 + * 列表与详情各自的权限表达式不变。 * * @author Chill */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CertificationAuditController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CertificationAuditController.java index 86dcf0da..6e6a024f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CertificationAuditController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CertificationAuditController.java @@ -101,7 +101,7 @@ public class CertificationAuditController extends BladeController { return R.status(certAuditService.audit(id, Boolean.TRUE.equals(pass), rejectReason)); } - // 不挂 @PreAuth:没有审核权限时也要能拿到 false,而不是被拦成 403 + // 本接口不挂 @PreAuth;无权限时返回 false。 @GetMapping("/capability") @ApiOperationSupport(order = 4) @Operation(summary = "审核能力判定", description = "无权限返回 false,不抛 403,供小程序决定空态与按钮禁用") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CertAuditServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CertAuditServiceImpl.java index 65310611..112231de 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CertAuditServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CertAuditServiceImpl.java @@ -185,7 +185,7 @@ public class CertAuditServiceImpl implements ICertAuditService { @Override public CertAuditCapabilityVO capability() { - // 菜单码与三个审核接口的 @PreAuth 表达式同源,不另写字面量,也不在这里求值表达式 + // 使用与三个审核接口 @PreAuth 相同的菜单码常量;表达式由框架求值,此处直接查菜单。 CertAuditCapabilityVO capability = new CertAuditCapabilityVO(); capability.setCanView(permissionHandler.hasMenu(CertAuditPermissions.DRIVER_VIEW_MENU) || permissionHandler.hasMenu(CertAuditPermissions.VEHICLE_VIEW_MENU)); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/CertAuditPermissions.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/CertAuditPermissions.java index 8a09c5b7..aa1d17a0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/CertAuditPermissions.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/CertAuditPermissions.java @@ -28,20 +28,14 @@ package org.springblade.transport.support; /** * 认证审核的权限表达式 *
- * 用菜单码而不是角色名。本项目的权限走「角色-菜单」授权,写死角色名有两个坑: - * 角色别名可能对不上(曾写成 {@code admin},而库里只有 {@code administrator}), - * 以及会漏掉实际承担审核的岗位(例如「运管」)。 + * 四个菜单码:司机查看 {@code cert_certification_audit_driver}、车辆查看 {@code cert_certification_audit_vehicle}、 + * 司机审核 {@code cert_certification_audit_driver_audit}、车辆审核 {@code cert_certification_audit_vehicle_audit}。 *
- * 用表达式而不是 {@code @PreAuth(menu = "...")} 的单值形式,是因为同一组接口 - * 由 {@code bizType} 参数区分、同时服务司机与车辆两侧,单值 menu 表达不了「二者之一」。 + * {@code AUDIT_VIEW} 与 {@code AUDIT_ACTION} 由上述常量拼接,结果仍是编译期常量。 + * 三个审核接口的 {@code @PreAuth} 与 {@code CertAuditServiceImpl#capability()} 使用同一组菜单码常量。 *
- * 四个菜单码在本类集中定义,权限表达式与能力判定接口都只引用这些常量, - * 避免同一串菜单码在多处各写一遍、改了一处漏掉另一处。 - *
- * 表达式最终由框架交给 SpEL 求值,root object 是 {@code AuthFun}, - * 故这里用的函数名必须与它的公开方法一致({@code hasMenu})。 - * {@code CertAuditPermissionsTest} 会实际解析并求值这两个表达式, - * 一旦写错函数名或括号,测试即失败——而不是等到线上请求时抛 500。 + * 表达式由框架交给 SpEL 求值,root object 是 {@code AuthFun},函数名须与它的公开方法一致({@code hasMenu})。 + * {@code CertAuditPermissionsTest} 会解析并求值这两个表达式。 * * @author Chill */ @@ -68,9 +62,9 @@ public final class CertAuditPermissions { public static final String VEHICLE_AUDIT_MENU = "cert_certification_audit_vehicle_audit"; /** - * 待审列表与审核详情:司机或车辆任一审核菜单即可 + * 待审列表与审核详情:司机或车辆任一查看菜单即可 *
- * 由上面两个查看菜单码拼成,结果仍是编译期常量,故 {@code @PreAuth} 可以直接引用。 + * 由上面两个查看菜单码拼成,结果仍是编译期常量,{@code @PreAuth} 可以直接引用。 */ public static final String AUDIT_VIEW = "hasMenu('" + DRIVER_VIEW_MENU + "') or hasMenu('" + VEHICLE_VIEW_MENU + "')"; diff --git a/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/CertAuditServiceImplTest.java b/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/CertAuditServiceImplTest.java index 56de6146..b780f977 100644 --- a/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/CertAuditServiceImplTest.java +++ b/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/CertAuditServiceImplTest.java @@ -35,6 +35,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.springblade.transport.support.CertAuditPermissions.DRIVER_AUDIT_MENU; +import static org.springblade.transport.support.CertAuditPermissions.DRIVER_VIEW_MENU; +import static org.springblade.transport.support.CertAuditPermissions.VEHICLE_AUDIT_MENU; /** * 管理端认证审核测试。 @@ -359,7 +362,7 @@ class CertAuditServiceImplTest { @Test @DisplayName("能力判定:只有司机查看菜单时能进审核页,但审核按钮必须禁用") void capabilityViewWithoutAudit() { - when(permissionHandler.hasMenu("cert_certification_audit_driver")).thenReturn(true); + when(permissionHandler.hasMenu(DRIVER_VIEW_MENU)).thenReturn(true); CertAuditCapabilityVO capability = service.capability(); @@ -370,7 +373,7 @@ class CertAuditServiceImplTest { @Test @DisplayName("能力判定:司机审核按钮菜单即可审核") void capabilityAuditWithDriverMenu() { - when(permissionHandler.hasMenu("cert_certification_audit_driver_audit")).thenReturn(true); + when(permissionHandler.hasMenu(DRIVER_AUDIT_MENU)).thenReturn(true); assertTrue(service.capability().getCanAudit(), "司机审核菜单应放行审核动作"); } @@ -378,7 +381,7 @@ class CertAuditServiceImplTest { @Test @DisplayName("能力判定:车辆审核按钮菜单即可审核") void capabilityAuditWithVehicleMenu() { - when(permissionHandler.hasMenu("cert_certification_audit_vehicle_audit")).thenReturn(true); + when(permissionHandler.hasMenu(VEHICLE_AUDIT_MENU)).thenReturn(true); assertTrue(service.capability().getCanAudit(), "车辆审核菜单应放行审核动作"); }