📝 认证审核注释改为事实描述并统一引用菜单码常量

This commit is contained in:
2026-10-26 03:39:55 +08:00
parent e0ff423de0
commit aac08bcbaa
5 changed files with 18 additions and 21 deletions
@@ -34,8 +34,8 @@ import java.io.Serializable;
/**
* 认证审核能力
* <p>
* 小程序端进入审核页前先取它决定空态与按钮禁用。没有权限时两个字段为 false,
* 而不是让接口返回 403——列表与详情各自仍挂权限表达式,这里只回答「能不能」。
* 无权限时两个字段为 false;本接口不挂权限表达式。
* 列表与详情各自的权限表达式不变。
*
* @author Chill
*/
@@ -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,供小程序决定空态与按钮禁用")
@@ -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));
@@ -28,20 +28,14 @@ package org.springblade.transport.support;
/**
* 认证审核的权限表达式
* <p>
* 用菜单码而不是角色名。本项目的权限走「角色-菜单」授权,写死角色名有两个坑:
* 角色别名可能对不上(曾写成 {@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}。
* <p>
* 用表达式而不是 {@code @PreAuth(menu = "...")} 的单值形式,是因为同一组接口
* 由 {@code bizType} 参数区分、同时服务司机与车辆两侧,单值 menu 表达不了「二者之一」。
* {@code AUDIT_VIEW} 与 {@code AUDIT_ACTION} 由上述常量拼接,结果仍是编译期常量。
* 三个审核接口的 {@code @PreAuth} 与 {@code CertAuditServiceImpl#capability()} 使用同一组菜单码常量。
* <p>
* 四个菜单码在本类集中定义,权限表达式与能力判定接口都只引用这些常量,
* 避免同一串菜单码在多处各写一遍、改了一处漏掉另一处。
* <p>
* 表达式最终由框架交给 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";
/**
* 待审列表与审核详情:司机或车辆任一审核菜单即可
* 待审列表与审核详情:司机或车辆任一查看菜单即可
* <p>
* 由上面两个查看菜单码拼成,结果仍是编译期常量,故 {@code @PreAuth} 可以直接引用。
* 由上面两个查看菜单码拼成,结果仍是编译期常量,{@code @PreAuth} 可以直接引用。
*/
public static final String AUDIT_VIEW =
"hasMenu('" + DRIVER_VIEW_MENU + "') or hasMenu('" + VEHICLE_VIEW_MENU + "')";
@@ -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(), "车辆审核菜单应放行审核动作");
}