🐛 修复小程序令牌严格校验 401,并开放调度端打卡接口
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+2
-13
@@ -30,11 +30,11 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springblade.core.oauth2.endpoint.OAuth2TokenEndPoint;
|
import org.springblade.core.oauth2.endpoint.OAuth2TokenEndPoint;
|
||||||
import org.springblade.core.secure.BladeUser;
|
import org.springblade.core.secure.BladeUser;
|
||||||
import org.springblade.core.tool.api.R;
|
import org.springblade.core.tool.api.R;
|
||||||
import org.springblade.core.tool.support.Kv;
|
|
||||||
import org.springblade.core.tool.utils.BeanUtil;
|
import org.springblade.core.tool.utils.BeanUtil;
|
||||||
import org.springblade.core.tool.utils.Func;
|
import org.springblade.core.tool.utils.Func;
|
||||||
import org.springblade.system.feign.ISysClient;
|
import org.springblade.system.feign.ISysClient;
|
||||||
import org.springblade.system.pojo.enums.MpUserIdentity;
|
import org.springblade.system.pojo.enums.MpUserIdentity;
|
||||||
|
import org.springblade.system.utils.MpUserAuth;
|
||||||
import org.springframework.core.MethodParameter;
|
import org.springframework.core.MethodParameter;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.converter.HttpMessageConverter;
|
import org.springframework.http.converter.HttpMessageConverter;
|
||||||
@@ -74,7 +74,7 @@ public class OAuth2UserInfoResponseAdvice implements ResponseBodyAdvice<Object>
|
|||||||
if (userInfo == null) {
|
if (userInfo == null) {
|
||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
if (isMpUser(bladeUser)) {
|
if (MpUserAuth.isMpUser(bladeUser)) {
|
||||||
// 小程序用户:按身份直接生成权限,不走系统角色菜单
|
// 小程序用户:按身份直接生成权限,不走系统角色菜单
|
||||||
userInfo.setPermission(MpUserIdentity.toPermissions(bladeUser.getRoleName()));
|
userInfo.setPermission(MpUserIdentity.toPermissions(bladeUser.getRoleName()));
|
||||||
} else {
|
} else {
|
||||||
@@ -83,17 +83,6 @@ public class OAuth2UserInfoResponseAdvice implements ResponseBodyAdvice<Object>
|
|||||||
return userInfo;
|
return userInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isMpUser(BladeUser bladeUser) {
|
|
||||||
Kv detail = bladeUser.getDetail();
|
|
||||||
if (detail != null && MpUserIdentity.DETAIL_TYPE.equalsIgnoreCase(Func.toStr(detail.get("type")))) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// 兼容:无系统角色且 roleName 为小程序身份
|
|
||||||
return Func.isBlank(bladeUser.getRoleId())
|
|
||||||
&& Func.isNotBlank(bladeUser.getRoleName())
|
|
||||||
&& !MpUserIdentity.split(bladeUser.getRoleName()).isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> loadPermission(String roleId) {
|
private List<String> loadPermission(String roleId) {
|
||||||
if (Func.isBlank(roleId)) {
|
if (Func.isBlank(roleId)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import org.springblade.system.pojo.entity.MpUserInfo;
|
|||||||
import org.springblade.system.pojo.entity.User;
|
import org.springblade.system.pojo.entity.User;
|
||||||
import org.springblade.system.pojo.entity.UserInfo;
|
import org.springblade.system.pojo.entity.UserInfo;
|
||||||
import org.springblade.system.pojo.enums.MpUserIdentity;
|
import org.springblade.system.pojo.enums.MpUserIdentity;
|
||||||
|
import org.springblade.system.utils.MpUserAuth;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 认证工具类
|
* 认证工具类
|
||||||
@@ -107,10 +108,13 @@ public class TokenUtil {
|
|||||||
userDetail.setAccount(user.getAccount());
|
userDetail.setAccount(user.getAccount());
|
||||||
userDetail.setPassword(user.getPassword());
|
userDetail.setPassword(user.getPassword());
|
||||||
userDetail.setPhone(user.getPhone());
|
userDetail.setPhone(user.getPhone());
|
||||||
userDetail.setDeptId(user.getDeptId());
|
// 严格令牌模式要求 deptId/roleId 非空且 >=0;小程序用户用占位值,身份写在 roleName/authorities
|
||||||
userDetail.setPostId(user.getPostId());
|
userDetail.setDeptId(Func.toStr(user.getDeptId(), MpUserAuth.PLACEHOLDER_ID));
|
||||||
// 小程序用户不绑定系统角色,roleId 留空;身份放入 roleName/authorities
|
if (Func.isBlank(userDetail.getDeptId()) || "-1".equals(userDetail.getDeptId())) {
|
||||||
userDetail.setRoleId("");
|
userDetail.setDeptId(MpUserAuth.PLACEHOLDER_ID);
|
||||||
|
}
|
||||||
|
userDetail.setPostId(Func.toStr(user.getPostId(), MpUserAuth.PLACEHOLDER_ID));
|
||||||
|
userDetail.setRoleId(MpUserAuth.PLACEHOLDER_ID);
|
||||||
userDetail.setRoleName(Func.join(userInfo.getIdentities()));
|
userDetail.setRoleName(Func.join(userInfo.getIdentities()));
|
||||||
userDetail.setAvatar(user.getAvatar());
|
userDetail.setAvatar(user.getAvatar());
|
||||||
userDetail.setAuthorities(userInfo.getIdentities());
|
userDetail.setAuthorities(userInfo.getIdentities());
|
||||||
|
|||||||
+12
-2
@@ -35,6 +35,14 @@ import org.springblade.system.pojo.enums.MpUserIdentity;
|
|||||||
*/
|
*/
|
||||||
public final class MpUserAuth {
|
public final class MpUserAuth {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 严格令牌模式下的占位 ID。
|
||||||
|
* <p>
|
||||||
|
* {@code blade.secure.strict-token=true} 时,AuthUtil.userIncomplete 要求 roleId/deptId
|
||||||
|
* 非空且数值 >= 0;小程序用户不绑定系统角色/部门,用 0 占位避免业务接口 401。
|
||||||
|
*/
|
||||||
|
public static final String PLACEHOLDER_ID = "0";
|
||||||
|
|
||||||
private MpUserAuth() {
|
private MpUserAuth() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,8 +64,10 @@ public final class MpUserAuth {
|
|||||||
if (detail != null && MpUserIdentity.DETAIL_TYPE.equalsIgnoreCase(Func.toStr(detail.get("type")))) {
|
if (detail != null && MpUserIdentity.DETAIL_TYPE.equalsIgnoreCase(Func.toStr(detail.get("type")))) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// 兼容:无系统角色且 roleName 为小程序身份
|
// 兼容:无真实系统角色(空或占位 0)且 roleName 为小程序身份
|
||||||
return Func.isBlank(bladeUser.getRoleId())
|
String roleId = Func.toStr(bladeUser.getRoleId());
|
||||||
|
boolean noSystemRole = Func.isBlank(roleId) || PLACEHOLDER_ID.equals(roleId);
|
||||||
|
return noSystemRole
|
||||||
&& Func.isNotBlank(bladeUser.getRoleName())
|
&& Func.isNotBlank(bladeUser.getRoleName())
|
||||||
&& !MpUserIdentity.split(bladeUser.getRoleName()).isEmpty();
|
&& !MpUserIdentity.split(bladeUser.getRoleName()).isEmpty();
|
||||||
}
|
}
|
||||||
|
|||||||
+19
@@ -30,6 +30,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
|||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import org.springblade.core.boot.ctrl.BladeController;
|
import org.springblade.core.boot.ctrl.BladeController;
|
||||||
import org.springblade.core.tool.api.R;
|
import org.springblade.core.tool.api.R;
|
||||||
|
import org.springblade.transport.pojo.dto.WaybillPunchRecordSaveRequest;
|
||||||
import org.springblade.transport.pojo.entity.Waybill;
|
import org.springblade.transport.pojo.entity.Waybill;
|
||||||
import org.springblade.transport.pojo.vo.AdminDriverOptionVO;
|
import org.springblade.transport.pojo.vo.AdminDriverOptionVO;
|
||||||
import org.springblade.transport.pojo.vo.AdminHomeStatsVO;
|
import org.springblade.transport.pojo.vo.AdminHomeStatsVO;
|
||||||
@@ -37,7 +38,9 @@ import org.springblade.transport.pojo.vo.AdminHomeVO;
|
|||||||
import org.springblade.transport.pojo.vo.AdminVehicleOptionVO;
|
import org.springblade.transport.pojo.vo.AdminVehicleOptionVO;
|
||||||
import org.springblade.transport.pojo.vo.AdminWaybillCardVO;
|
import org.springblade.transport.pojo.vo.AdminWaybillCardVO;
|
||||||
import org.springblade.transport.pojo.vo.AdminWaybillDetailVO;
|
import org.springblade.transport.pojo.vo.AdminWaybillDetailVO;
|
||||||
|
import org.springblade.transport.pojo.vo.WaybillPunchRecordsVO;
|
||||||
import org.springblade.transport.service.IManageWaybillService;
|
import org.springblade.transport.service.IManageWaybillService;
|
||||||
|
import org.springblade.transport.service.IWaybillService;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
@@ -62,6 +65,7 @@ import java.util.List;
|
|||||||
public class ManageWaybillController extends BladeController {
|
public class ManageWaybillController extends BladeController {
|
||||||
|
|
||||||
private final IManageWaybillService manageWaybillService;
|
private final IManageWaybillService manageWaybillService;
|
||||||
|
private final IWaybillService waybillService;
|
||||||
|
|
||||||
@GetMapping("/stats")
|
@GetMapping("/stats")
|
||||||
@ApiOperationSupport(order = 1)
|
@ApiOperationSupport(order = 1)
|
||||||
@@ -140,4 +144,19 @@ public class ManageWaybillController extends BladeController {
|
|||||||
return R.data(manageWaybillService.searchVehicles(keyword));
|
return R.data(manageWaybillService.searchVehicles(keyword));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/punch-records")
|
||||||
|
@ApiOperationSupport(order = 9)
|
||||||
|
@Operation(summary = "打卡记录", description = "小程序调度端:仅需登录态;按过程配置返回节点/在途打卡流水")
|
||||||
|
public R<WaybillPunchRecordsVO> punchRecords(
|
||||||
|
@Parameter(description = "运单ID", required = true) @RequestParam Long waybillId) {
|
||||||
|
return R.data(waybillService.listPunchRecords(waybillId));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/punch-record/save")
|
||||||
|
@ApiOperationSupport(order = 10)
|
||||||
|
@Operation(summary = "编辑打卡记录", description = "小程序调度端:补录/订正/取消打卡,仅需登录态")
|
||||||
|
public R savePunchRecord(@RequestBody WaybillPunchRecordSaveRequest request) {
|
||||||
|
return R.status(waybillService.savePunchRecord(request));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user