From f6f591a870a9e21df5f8366922715e4dec3e5187 Mon Sep 17 00:00:00 2001 From: lihongbiao <964708803@qq.com> Date: Thu, 17 Jul 2025 14:58:25 +0800 Subject: [PATCH] =?UTF-8?q?b=E7=AB=AF=E7=99=BB=E5=BD=95&=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E6=A8=A1=E7=B3=8A=E6=9F=A5=E8=AF=A2&=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E8=87=AA=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/aircraft/utils/SecurityUtils.java | 30 ++- .../com/aircraft/utils/SpringBeanHolder.java | 5 + .../modules/security/rest/AuthController.java | 6 +- .../security/security/TokenProvider.java | 47 ++--- .../security/service/BOnlineUserService.java | 38 ++-- .../security/service/BUserDetailsService.java | 55 +++--- .../security/service/dto/JwtCustomerDto.java | 164 ++++++++--------- .../controller/CnCustomerController.java | 173 +++++++----------- .../controller/EmEmployeesController.java | 5 +- .../modules/system/domain/CnCustomer.java | 5 + .../modules/system/domain/EmArea.java | 3 + .../modules/system/domain/EmScenic.java | 4 + .../service/impl/CnCustomerServiceImpl.java | 4 + 13 files changed, 281 insertions(+), 258 deletions(-) diff --git a/aircraft-common/src/main/java/com/aircraft/utils/SecurityUtils.java b/aircraft-common/src/main/java/com/aircraft/utils/SecurityUtils.java index 3bda226..42ad747 100644 --- a/aircraft-common/src/main/java/com/aircraft/utils/SecurityUtils.java +++ b/aircraft-common/src/main/java/com/aircraft/utils/SecurityUtils.java @@ -18,6 +18,7 @@ package com.aircraft.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.jwt.JWT; import cn.hutool.jwt.JWTUtil; +import com.aircraft.exception.BadRequestException; import com.aircraft.utils.enums.UserTypeEnum; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; @@ -25,6 +26,8 @@ import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import com.aircraft.utils.enums.DataScopeEnum; import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Component; @@ -32,6 +35,7 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.List; +import java.util.Map; import java.util.Objects; /** @@ -62,10 +66,34 @@ public class SecurityUtils { * @return UserDetails */ public static UserDetails getCurrentUser() { - UserDetailsService userDetailsService = SpringBeanHolder.getBean(UserDetailsService.class); +// UserDetailsService userDetailsService = SpringBeanHolder.getBean(UserDetailsService.class); +// return userDetailsService.loadUserByUsername(getCurrentUsername()); + String userType = String.valueOf(getCurrentUserTypeVo()); + UserDetailsService userDetailsService; + + if (UserTypeEnum.CUSTOMER.equals(UserTypeEnum.valueOf(userType))) { + userDetailsService = SpringBeanHolder.getBean("bUserDetailsService", UserDetailsService.class); + } else { + userDetailsService = SpringBeanHolder.getBean("userDetailsService", UserDetailsService.class); + } return userDetailsService.loadUserByUsername(getCurrentUsername()); } + // 添加获取当前用户类型的方法 + public static String getCurrentUserTypeVo() { + final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + throw new BadRequestException("当前登录状态过期"); + } + + // 从认证信息中获取用户类型(在登录时设置) + if (authentication.getDetails() instanceof Map) { + Map details = (Map) authentication.getDetails(); + return (String) details.get("userType"); + } + return "ADMIN"; // 默认类型 + } + /** * 获取当前用户的数据权限 * @return / diff --git a/aircraft-common/src/main/java/com/aircraft/utils/SpringBeanHolder.java b/aircraft-common/src/main/java/com/aircraft/utils/SpringBeanHolder.java index 9b3e674..6b6e19c 100644 --- a/aircraft-common/src/main/java/com/aircraft/utils/SpringBeanHolder.java +++ b/aircraft-common/src/main/java/com/aircraft/utils/SpringBeanHolder.java @@ -61,6 +61,11 @@ public class SpringBeanHolder implements ApplicationContextAware, DisposableBean return (T) applicationContext.getBean(name); } + // 添加按名称和类型获取 Bean 的方法 + public static T getBean(String name, Class clazz) { + return applicationContext.getBean(name, clazz); + } + /** * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. */ diff --git a/aircraft-system/src/main/java/com/aircraft/modules/security/rest/AuthController.java b/aircraft-system/src/main/java/com/aircraft/modules/security/rest/AuthController.java index 95736b7..76287f9 100644 --- a/aircraft-system/src/main/java/com/aircraft/modules/security/rest/AuthController.java +++ b/aircraft-system/src/main/java/com/aircraft/modules/security/rest/AuthController.java @@ -16,6 +16,7 @@ package com.aircraft.modules.security.rest; import cn.hutool.core.util.IdUtil; +import com.aircraft.utils.enums.UserTypeEnum; import com.wf.captcha.base.Captcha; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -97,7 +98,10 @@ public class AuthController { if (!passwordEncoder.matches(password, jwtUser.getPassword())) { throw new BadRequestException("登录密码错误"); } - Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + Map details = new HashMap<>(); + details.put("userType", String.valueOf(jwtUser.getUserType().getValue())); + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + authentication.setDetails(details); SecurityContextHolder.getContext().setAuthentication(authentication); // 生成令牌 String token = tokenProvider.createToken(jwtUser); diff --git a/aircraft-system/src/main/java/com/aircraft/modules/security/security/TokenProvider.java b/aircraft-system/src/main/java/com/aircraft/modules/security/security/TokenProvider.java index b5a16c4..3959c68 100644 --- a/aircraft-system/src/main/java/com/aircraft/modules/security/security/TokenProvider.java +++ b/aircraft-system/src/main/java/com/aircraft/modules/security/security/TokenProvider.java @@ -19,6 +19,7 @@ import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; //import com.aircraft.modules.security.service.dto.JwtCustomerDto; +import com.aircraft.modules.security.service.dto.JwtCustomerDto; import io.jsonwebtoken.*; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; @@ -87,29 +88,29 @@ public class TokenProvider implements InitializingBean { .compact(); } -// /** -// * 创建Token 设置永不过期, -// * Token 的时间有效性转到Redis 维护 -// * @param user / -// * @return / -// */ -// public String createToken(JwtCustomerDto user) { -// // 设置参数 -// Map claims = new HashMap<>(6); -// // 设置用户ID -// claims.put(AUTHORITIES_UID_KEY, user.getUser().getId()); -// // 设置UUID,确保每次Token不一样 -// claims.put(AUTHORITIES_UUID_KEY, IdUtil.simpleUUID()); -// // 直接调用 Jwts.builder() 创建新实例 -// return Jwts.builder() -// // 设置自定义 Claims -// .setClaims(claims) -// // 设置主题 -// .setSubject(user.getUsername()) -// // 使用预生成的签名密钥和算法签名 -// .signWith(signingKey, SignatureAlgorithm.HS512) -// .compact(); -// } + /** + * 创建Token 设置永不过期, + * Token 的时间有效性转到Redis 维护 + * @param user / + * @return / + */ + public String createToken(JwtCustomerDto user) { + // 设置参数 + Map claims = new HashMap<>(6); + // 设置用户ID + claims.put(AUTHORITIES_UID_KEY, user.getUser().getId()); + // 设置UUID,确保每次Token不一样 + claims.put(AUTHORITIES_UUID_KEY, IdUtil.simpleUUID()); + // 直接调用 Jwts.builder() 创建新实例 + return Jwts.builder() + // 设置自定义 Claims + .setClaims(claims) + // 设置主题 + .setSubject(user.getUsername()) + // 使用预生成的签名密钥和算法签名 + .signWith(signingKey, SignatureAlgorithm.HS512) + .compact(); + } /** * 依据Token 获取鉴权信息 diff --git a/aircraft-system/src/main/java/com/aircraft/modules/security/service/BOnlineUserService.java b/aircraft-system/src/main/java/com/aircraft/modules/security/service/BOnlineUserService.java index fe1a57f..b08c462 100644 --- a/aircraft-system/src/main/java/com/aircraft/modules/security/service/BOnlineUserService.java +++ b/aircraft-system/src/main/java/com/aircraft/modules/security/service/BOnlineUserService.java @@ -1,19 +1,19 @@ -//package com.aircraft.modules.security.service; -// -//import com.aircraft.modules.security.service.dto.JwtCustomerDto; -//import com.aircraft.modules.security.service.dto.JwtUserDto; -//import org.springframework.stereotype.Service; -// -//import javax.servlet.http.HttpServletRequest; -// -//@Service -//public class BOnlineUserService { -// public void save(JwtCustomerDto user, String token, HttpServletRequest request) { -// // 实现B端在线用户存储逻辑 -// // 可存入不同redis前缀的键值对 -// } -// -// public void kickOutForUsername(String username) { -// // B端踢人逻辑 -// } -//} \ No newline at end of file +package com.aircraft.modules.security.service; + +import com.aircraft.modules.security.service.dto.JwtCustomerDto; +import com.aircraft.modules.security.service.dto.JwtUserDto; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; + +@Service +public class BOnlineUserService { + public void save(JwtCustomerDto user, String token, HttpServletRequest request) { + // 实现B端在线用户存储逻辑 + // 可存入不同redis前缀的键值对 + } + + public void kickOutForUsername(String username) { + // B端踢人逻辑 + } +} \ No newline at end of file diff --git a/aircraft-system/src/main/java/com/aircraft/modules/security/service/BUserDetailsService.java b/aircraft-system/src/main/java/com/aircraft/modules/security/service/BUserDetailsService.java index e34af4a..4be2bd0 100644 --- a/aircraft-system/src/main/java/com/aircraft/modules/security/service/BUserDetailsService.java +++ b/aircraft-system/src/main/java/com/aircraft/modules/security/service/BUserDetailsService.java @@ -1,27 +1,28 @@ -//package com.aircraft.modules.security.service; -// -//import com.aircraft.modules.security.service.dto.JwtCustomerDto; -//import com.aircraft.modules.security.service.dto.JwtUserDto; -//import com.aircraft.modules.system.domain.CnCustomer; -//import com.aircraft.modules.system.service.CnCustomerService; -//import lombok.RequiredArgsConstructor; -//import lombok.extern.slf4j.Slf4j; -//import org.springframework.security.core.userdetails.UserDetailsService; -//import org.springframework.stereotype.Service; -// -//@Slf4j -//@RequiredArgsConstructor -//@Service("bUserDetailsService") -//public class BUserDetailsService implements UserDetailsService { -// -// private final CnCustomerService cnCustomerService; -// -// @Override -// public JwtCustomerDto loadUserByUsername(String phone) { -// // 查询B端用户表(如b_user) -// CnCustomer customer = cnCustomerService.findByphone(phone); -// // 转换JwtUserDto(包含权限信息) -//// return convertToJwtUser(customer); -// return null; -// } -//} \ No newline at end of file +package com.aircraft.modules.security.service; + +import com.aircraft.modules.security.service.dto.JwtCustomerDto; +import com.aircraft.modules.security.service.dto.JwtUserDto; +import com.aircraft.modules.system.domain.CnCustomer; +import com.aircraft.modules.system.service.CnCustomerService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Service; + +@Slf4j +@RequiredArgsConstructor +@Service("bUserDetailsService") +public class BUserDetailsService implements UserDetailsService { + + private final CnCustomerService cnCustomerService; + + @Override + public JwtCustomerDto loadUserByUsername(String phone) { + // 查询B端用户表(如b_user) + CnCustomer customer = cnCustomerService.findByphone(phone); + // 转换JwtUserDto(包含权限信息) +// return convertToJwtUser(customer); + return null; + } + +} \ No newline at end of file diff --git a/aircraft-system/src/main/java/com/aircraft/modules/security/service/dto/JwtCustomerDto.java b/aircraft-system/src/main/java/com/aircraft/modules/security/service/dto/JwtCustomerDto.java index ddba8ee..b30a3e4 100644 --- a/aircraft-system/src/main/java/com/aircraft/modules/security/service/dto/JwtCustomerDto.java +++ b/aircraft-system/src/main/java/com/aircraft/modules/security/service/dto/JwtCustomerDto.java @@ -1,82 +1,82 @@ -///* -// * Copyright 2019-2025 Zheng Jie -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ -//package com.aircraft.modules.security.service.dto; -// -//import com.aircraft.modules.system.domain.CnCustomer; -//import com.aircraft.modules.system.domain.Dept; -//import com.aircraft.modules.system.domain.EmEmployees; -//import com.aircraft.utils.enums.UserTypeEnum; -//import com.alibaba.fastjson2.annotation.JSONField; -//import io.swagger.annotations.ApiModelProperty; -//import lombok.AllArgsConstructor; -//import lombok.Getter; -//import org.springframework.security.core.userdetails.UserDetails; -// -//import java.util.ArrayList; -//import java.util.List; -//import java.util.Set; -//import java.util.stream.Collectors; -// -///** -// * @author Zheng Jie -// * @date 2018-11-23 -// */ -//@Getter -//@AllArgsConstructor -//public class JwtCustomerDto implements UserDetails { -// -// @ApiModelProperty(value = "用户") -// private LoginUserDto user; -// -// @ApiModelProperty(value = "角色") -// private final List authorities; -// -// @Override -// @JSONField(serialize = false) -// public String getPassword() { -// return user.getPassword(); -// } -// -// @Override -// @JSONField(serialize = false) -// public String getUsername() { -// return user.getUsername(); -// } -// -// @JSONField(serialize = false) -// @Override -// public boolean isAccountNonExpired() { -// return true; -// } -// -// @JSONField(serialize = false) -// @Override -// public boolean isAccountNonLocked() { -// return true; -// } -// -// @JSONField(serialize = false) -// @Override -// public boolean isCredentialsNonExpired() { -// return true; -// } -// -// @Override -// @JSONField(serialize = false) -// public boolean isEnabled() { -// return user.getEnabled(); -// } -//} +/* + * Copyright 2019-2025 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.aircraft.modules.security.service.dto; + +import com.aircraft.modules.system.domain.CnCustomer; +import com.aircraft.modules.system.domain.Dept; +import com.aircraft.modules.system.domain.EmEmployees; +import com.aircraft.utils.enums.UserTypeEnum; +import com.alibaba.fastjson2.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author Zheng Jie + * @date 2018-11-23 + */ +@Getter +@AllArgsConstructor +public class JwtCustomerDto implements UserDetails { + + @ApiModelProperty(value = "用户") + private LoginUserDto user; + + @ApiModelProperty(value = "角色") + private final List authorities; + + @Override + @JSONField(serialize = false) + public String getPassword() { + return user.getPassword(); + } + + @Override + @JSONField(serialize = false) + public String getUsername() { + return user.getUsername(); + } + + @JSONField(serialize = false) + @Override + public boolean isAccountNonExpired() { + return true; + } + + @JSONField(serialize = false) + @Override + public boolean isAccountNonLocked() { + return true; + } + + @JSONField(serialize = false) + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + @JSONField(serialize = false) + public boolean isEnabled() { + return user.getEnabled(); + } +} diff --git a/aircraft-system/src/main/java/com/aircraft/modules/system/controller/CnCustomerController.java b/aircraft-system/src/main/java/com/aircraft/modules/system/controller/CnCustomerController.java index 251973e..be3d86c 100644 --- a/aircraft-system/src/main/java/com/aircraft/modules/system/controller/CnCustomerController.java +++ b/aircraft-system/src/main/java/com/aircraft/modules/system/controller/CnCustomerController.java @@ -9,8 +9,12 @@ import com.aircraft.modules.security.config.BLoginProperties; import com.aircraft.modules.security.config.LoginProperties; import com.aircraft.modules.security.config.SecurityProperties; import com.aircraft.modules.security.security.TokenProvider; +import com.aircraft.modules.security.service.BOnlineUserService; +import com.aircraft.modules.security.service.BUserDetailsService; import com.aircraft.modules.security.service.OnlineUserService; import com.aircraft.modules.security.service.UserDetailsServiceImpl; +import com.aircraft.modules.security.service.dto.AuthUserDto; +import com.aircraft.modules.security.service.dto.JwtCustomerDto; import com.aircraft.modules.system.domain.CnCustomer; import com.aircraft.modules.system.service.CnCustomerService; import com.aircraft.utils.PageResult; @@ -70,9 +74,9 @@ public class CnCustomerController { private final LoginProperties loginProperties; private final PasswordEncoder passwordEncoder; private final UserDetailsServiceImpl userDetailsService; -// private final BUserDetailsService bUserDetailsService; -// private final BLoginProperties bLoginProperties; -// private final BOnlineUserService bOnlineUserService; + private final BUserDetailsService bUserDetailsService; + private final BLoginProperties bLoginProperties; + private final BOnlineUserService bOnlineUserService; @Log("分页查询客户") @ApiOperation(value = "分页查询客户", notes = "分页查询客户") @@ -84,24 +88,24 @@ public class CnCustomerController { return new ResponseEntity<>(records,HttpStatus.OK); } - @Log("删除客户") - @ApiOperation(value = "删除客户") - @RequestMapping(value = "{id}", method = {RequestMethod.DELETE}) - @ApiImplicitParam(name = "id", value = "客户ID", required = true, paramType = "path") - public ResponseEntity delete(@PathVariable final Integer id) { - try { - CnCustomer entity = entityService.getById(id); - entity.setDelFlag(1); - entityService.updateById(entity); - return new ResponseEntity<>("成功删除客户", HttpStatus.OK); - } catch (DataIntegrityViolationException e) { - LOG.error("删除客户失败", e); - throw new RuntimeException( "删除客户失败,该客户不能删除,存在其他关联数据"); - } catch (Exception e) { - LOG.error("删除客户失败", e); - throw new RuntimeException("删除客户失败", e); - } - } +// @Log("删除客户") +// @ApiOperation(value = "删除客户") +// @RequestMapping(value = "{id}", method = {RequestMethod.DELETE}) +// @ApiImplicitParam(name = "id", value = "客户ID", required = true, paramType = "path") +// public ResponseEntity delete(@PathVariable final Integer id) { +// try { +// CnCustomer entity = entityService.getById(id); +// entity.setDelFlag(1); +// entityService.updateById(entity); +// return new ResponseEntity<>("成功删除客户", HttpStatus.OK); +// } catch (DataIntegrityViolationException e) { +// LOG.error("删除客户失败", e); +// throw new RuntimeException( "删除客户失败,该客户不能删除,存在其他关联数据"); +// } catch (Exception e) { +// LOG.error("删除客户失败", e); +// throw new RuntimeException("删除客户失败", e); +// } +// } @Log("查询单个客户") @ApiOperation(value = "查询单个客户") @@ -122,6 +126,8 @@ public class CnCustomerController { @RequestMapping(method = {RequestMethod.POST}) public ResponseEntity add(@Valid @RequestBody final CnCustomer entity) { try { + entity.setStatus("1"); + entity.setPassword(passwordEncoder.encode("123456")); entityService.save(entity); return new ResponseEntity<>("成功保存客户", HttpStatus.OK); } catch (Exception e) { @@ -156,89 +162,48 @@ public class CnCustomerController { return new ResponseEntity<>(Collections.emptyList(),HttpStatus.OK); } -// @Log("用户登录") -// @ApiOperation("登录授权") -// @AnonymousPostMapping(value = "/login") -// public ResponseEntity login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception { -// // 密码解密 -// String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword()); -// // 查询验证码 -// String code = redisUtils.get(authUser.getUuid(), String.class); -// // 清除验证码 -// redisUtils.del(authUser.getUuid()); -// if (StringUtils.isBlank(code)) { -// throw new BadRequestException("验证码不存在或已过期"); -// } -// if (StringUtils.isBlank(authUser.getCode()) || !authUser.getCode().equalsIgnoreCase(code)) { -// throw new BadRequestException("验证码错误"); -// } -// // 获取用户信息 -// JwtUserDto jwtUser = userDetailsService.loadUserByUsername(authUser.getUsername()); -// // 验证用户密码 -// if (!passwordEncoder.matches(password, jwtUser.getPassword())) { -// throw new BadRequestException("登录密码错误"); -// } -// Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); -// SecurityContextHolder.getContext().setAuthentication(authentication); -// // 生成令牌 -// String token = tokenProvider.createToken(jwtUser); -// // 返回 token 与 用户信息 -// Map authInfo = new HashMap(2) {{ -// put("token", properties.getTokenStartWith() + token); -// put("user", jwtUser); -// }}; -// if (loginProperties.isSingleLogin()) { -// // 踢掉之前已经登录的token -// onlineUserService.kickOutForUsername(authUser.getUsername()); -// } -// // 保存在线信息 -// onlineUserService.save(jwtUser, token, request); -// // 返回登录信息 -// return ResponseEntity.ok(authInfo); -// } + @Log("B端用户登录") + @ApiOperation("B端登录授权") + @AnonymousPostMapping(value = "/b/login") + public ResponseEntity loginB(@Validated @RequestBody AuthUserDto authUser, + HttpServletRequest request) throws Exception { -// @Log("B端用户登录") -// @ApiOperation("B端登录授权") -// @AnonymousPostMapping(value = "/b/login") -// public ResponseEntity loginB(@Validated @RequestBody AuthUserDto authUser, -// HttpServletRequest request) throws Exception { -// -// // 1. 密码解密(与后台相同) -// String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword()); -// -// // 3. 使用B端专属服务加载用户 ★核心修改★ -// // 假设:BUserDetailsService 是专门为B端实现的UserDetailsService -// JwtCustomerDto jwtUser = bUserDetailsService.loadUserByUsername(authUser.getUsername()); -// -// // 4. 密码验证(保持相同逻辑) -// if (!passwordEncoder.matches(password, jwtUser.getPassword())) { -// throw new BadRequestException("登录密码错误"); -// } -// -// // 5. 设置认证信息 -// Authentication authentication = new UsernamePasswordAuthenticationToken( -// jwtUser, null, jwtUser.getAuthorities() -// ); -// SecurityContextHolder.getContext().setAuthentication(authentication); -// -// // 6. 生成令牌(复用相同机制) -// String token = tokenProvider.createToken(jwtUser); -// -// // 7. 返回信息(可调整返回字段) -// Map authInfo = new HashMap<>(2) {{ -// put("token", properties.getTokenStartWith() + token); -// put("user", jwtUser); // 返回B端用户信息 -// }}; -// -// // 8. 单设备登录控制(可选) -// if (bLoginProperties.isSingleLogin()) { // B端专属配置 -// bOnlineUserService.kickOutForUsername(authUser.getUsername()); -// } -// -// // 9. 保存B端在线用户 ★核心修改★ -// bOnlineUserService.save(jwtUser, token, request); -// -// return ResponseEntity.ok(authInfo); -// } + // 1. 密码解密(与后台相同) + String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword()); + + // 3. 使用B端专属服务加载用户 ★核心修改★ + // 假设:BUserDetailsService 是专门为B端实现的UserDetailsService + JwtCustomerDto jwtUser = bUserDetailsService.loadUserByUsername(authUser.getUsername()); + + // 4. 密码验证(保持相同逻辑) + if (!passwordEncoder.matches(password, jwtUser.getPassword())) { + throw new BadRequestException("登录密码错误"); + } + + // 5. 设置认证信息 + Authentication authentication = new UsernamePasswordAuthenticationToken( + jwtUser, null, jwtUser.getAuthorities() + ); + SecurityContextHolder.getContext().setAuthentication(authentication); + + // 6. 生成令牌(复用相同机制) + String token = tokenProvider.createToken(jwtUser); + + // 7. 返回信息(可调整返回字段) + Map authInfo = new HashMap<>(2) {{ + put("token", properties.getTokenStartWith() + token); + put("user", jwtUser); // 返回B端用户信息 + }}; + + // 8. 单设备登录控制(可选) + if (bLoginProperties.isSingleLogin()) { // B端专属配置 + bOnlineUserService.kickOutForUsername(authUser.getUsername()); + } + + // 9. 保存B端在线用户 ★核心修改★ + bOnlineUserService.save(jwtUser, token, request); + + return ResponseEntity.ok(authInfo); + } } diff --git a/aircraft-system/src/main/java/com/aircraft/modules/system/controller/EmEmployeesController.java b/aircraft-system/src/main/java/com/aircraft/modules/system/controller/EmEmployeesController.java index 316d601..bd7d95e 100644 --- a/aircraft-system/src/main/java/com/aircraft/modules/system/controller/EmEmployeesController.java +++ b/aircraft-system/src/main/java/com/aircraft/modules/system/controller/EmEmployeesController.java @@ -147,7 +147,10 @@ public class EmEmployeesController { if (!passwordEncoder.matches(password, jwtUser.getPassword())) { throw new BadRequestException("登录密码错误"); } - Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + Map details = new HashMap<>(); + details.put("userType", String.valueOf(jwtUser.getUserType().getValue())); + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + authentication.setDetails(details); SecurityContextHolder.getContext().setAuthentication(authentication); // 生成令牌 String token = tokenProvider.createToken(jwtUser); diff --git a/aircraft-system/src/main/java/com/aircraft/modules/system/domain/CnCustomer.java b/aircraft-system/src/main/java/com/aircraft/modules/system/domain/CnCustomer.java index 81a3933..21edb0d 100644 --- a/aircraft-system/src/main/java/com/aircraft/modules/system/domain/CnCustomer.java +++ b/aircraft-system/src/main/java/com/aircraft/modules/system/domain/CnCustomer.java @@ -1,11 +1,15 @@ package com.aircraft.modules.system.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.aircraft.base.BaseEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotNull; + /** *

* @@ -21,6 +25,7 @@ public class CnCustomer extends BaseEntity { private static final long serialVersionUID = 1L; + @TableId(value="id", type = IdType.AUTO) private Long id; /** diff --git a/aircraft-system/src/main/java/com/aircraft/modules/system/domain/EmArea.java b/aircraft-system/src/main/java/com/aircraft/modules/system/domain/EmArea.java index 69432a2..2646227 100644 --- a/aircraft-system/src/main/java/com/aircraft/modules/system/domain/EmArea.java +++ b/aircraft-system/src/main/java/com/aircraft/modules/system/domain/EmArea.java @@ -1,5 +1,7 @@ package com.aircraft.modules.system.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.aircraft.base.BaseEntity; import lombok.Data; @@ -20,6 +22,7 @@ public class EmArea extends BaseEntity { private static final long serialVersionUID = 1L; + @TableId(value="id", type = IdType.AUTO) private Long id; /** diff --git a/aircraft-system/src/main/java/com/aircraft/modules/system/domain/EmScenic.java b/aircraft-system/src/main/java/com/aircraft/modules/system/domain/EmScenic.java index 5c9559a..cc072cb 100644 --- a/aircraft-system/src/main/java/com/aircraft/modules/system/domain/EmScenic.java +++ b/aircraft-system/src/main/java/com/aircraft/modules/system/domain/EmScenic.java @@ -1,6 +1,9 @@ package com.aircraft.modules.system.domain; import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.aircraft.base.BaseEntity; import lombok.Data; @@ -21,6 +24,7 @@ public class EmScenic extends BaseEntity { private static final long serialVersionUID = 1L; + @TableId(value="id", type = IdType.AUTO) private Long id; /** diff --git a/aircraft-system/src/main/java/com/aircraft/modules/system/service/impl/CnCustomerServiceImpl.java b/aircraft-system/src/main/java/com/aircraft/modules/system/service/impl/CnCustomerServiceImpl.java index 1303072..cdc46ca 100644 --- a/aircraft-system/src/main/java/com/aircraft/modules/system/service/impl/CnCustomerServiceImpl.java +++ b/aircraft-system/src/main/java/com/aircraft/modules/system/service/impl/CnCustomerServiceImpl.java @@ -6,6 +6,7 @@ import com.aircraft.modules.system.mapper.CnCustomerMapper; import com.aircraft.modules.system.service.CnCustomerService; import com.aircraft.utils.PageResult; import com.aircraft.utils.PageUtil; +import com.aircraft.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -50,7 +51,10 @@ public class CnCustomerServiceImpl extends ServiceImpl buildWrapper(CnCustomer example) { + String phone = example.getPhone(); QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda() + .eq(StringUtils.isNotEmpty(phone),CnCustomer::getPhone,phone); return wrapper; } }