mirror of
https://gitee.com/log4j/pig.git
synced 2024-12-31 08:14:18 +08:00
✨ Introducing new features. 完善安全校验,注册、修改手机号 均需要手机号验证码
This commit is contained in:
parent
8cfa9c75be
commit
15c0949ea7
@ -38,7 +38,7 @@
|
||||
|
||||
| 依赖 | 版本 |
|
||||
| ---------------------- |------------|
|
||||
| Spring Boot | 2.7.3 |
|
||||
| Spring Boot | 2.7.4 |
|
||||
| Spring Cloud | 2021.0.4 |
|
||||
| Spring Cloud Alibaba | 2021.0.4.0 |
|
||||
| Spring Authorization Server | 0.3.1 |
|
||||
|
@ -115,7 +115,7 @@ public interface SecurityConstants {
|
||||
/**
|
||||
* 短信登录 参数名称
|
||||
*/
|
||||
String SMS_PARAMETER_NAME = "mobile";
|
||||
String SMS_PARAMETER_NAME = "phone";
|
||||
|
||||
/**
|
||||
* 授权码模式confirm
|
||||
|
@ -88,6 +88,11 @@ public interface ErrorCodes {
|
||||
*/
|
||||
String SYS_APP_SMS_OFTEN = "sys.app.sms.often";
|
||||
|
||||
/**
|
||||
* 验证码错误
|
||||
*/
|
||||
String SYS_APP_SMS_ERROR = "sys.app.sms.error";
|
||||
|
||||
/**
|
||||
* 手机号未注册
|
||||
*/
|
||||
|
@ -18,6 +18,7 @@ sys.param.config.error={0} \u7CFB\u7EDF\u53C2\u6570\u914D\u7F6E\u9519\u8BEF
|
||||
sys.menu.delete.existing=\u83DC\u5355\u542B\u6709\u4E0B\u7EA7\u4E0D\u80FD\u5220\u9664
|
||||
|
||||
sys.app.sms.often=\u9A8C\u8BC1\u7801\u53D1\u9001\u8FC7\u9891\u7E41
|
||||
sys.app.sms.error=\u9A8C\u8BC1\u7801\u9519\u8BEF
|
||||
sys.app.phone.unregistered={0} \u624B\u673A\u53F7\u672A\u6CE8\u518C
|
||||
|
||||
sys.dict.delete.system=\u7CFB\u7EDF\u5185\u7F6E\u5B57\u5178\u9879\u76EE\u4E0D\u80FD\u5220\u9664
|
||||
|
@ -115,18 +115,18 @@ public class ValidateCodeGatewayFilter extends AbstractGatewayFilterFactory<Obje
|
||||
|
||||
String randomStr = request.getQueryParams().getFirst("randomStr");
|
||||
if (CharSequenceUtil.isBlank(randomStr)) {
|
||||
randomStr = request.getQueryParams().getFirst("mobile");
|
||||
randomStr = request.getQueryParams().getFirst(SecurityConstants.SMS_PARAMETER_NAME);
|
||||
}
|
||||
|
||||
String key = CacheConstants.DEFAULT_CODE_KEY + randomStr;
|
||||
|
||||
Object codeObj = redisTemplate.opsForValue().get(key);
|
||||
|
||||
redisTemplate.delete(key);
|
||||
|
||||
if (ObjectUtil.isEmpty(codeObj) || !code.equals(codeObj)) {
|
||||
throw new ValidateCodeException("验证码不合法");
|
||||
}
|
||||
|
||||
redisTemplate.delete(key);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -47,4 +47,9 @@ public class UserDTO extends SysUser {
|
||||
*/
|
||||
private String newpassword1;
|
||||
|
||||
/**
|
||||
* 验证码
|
||||
*/
|
||||
private String code;
|
||||
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ public class UserController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户信息
|
||||
* 管理员更新用户信息
|
||||
* @param userDto 用户信息
|
||||
* @return R
|
||||
*/
|
||||
@ -164,7 +164,7 @@ public class UserController {
|
||||
@PutMapping
|
||||
@PreAuthorize("@pms.hasPermission('sys_user_edit')")
|
||||
public R<Boolean> updateUser(@Valid @RequestBody UserDTO userDto) {
|
||||
return R.ok(userService.updateUser(userDto));
|
||||
return userService.updateUser(userDto);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -179,7 +179,7 @@ public class UserController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改个人信息
|
||||
* 个人修改个人信息
|
||||
* @param userDto userDto
|
||||
* @return success/false
|
||||
*/
|
||||
@ -187,7 +187,7 @@ public class UserController {
|
||||
@PutMapping("/edit")
|
||||
public R<Boolean> updateUserInfo(@Valid @RequestBody UserDTO userDto) {
|
||||
userDto.setUsername(SecurityUtils.getUser().getUsername());
|
||||
return R.ok(userService.updateUserInfo(userDto));
|
||||
return userService.updateUserInfo(userDto);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -27,9 +27,17 @@ public interface AppService {
|
||||
|
||||
/**
|
||||
* 发送手机验证码
|
||||
* @param mobile mobile
|
||||
* @param phone phone
|
||||
* @return code
|
||||
*/
|
||||
R<Boolean> sendSmsCode(String mobile);
|
||||
R<Boolean> sendSmsCode(String phone);
|
||||
|
||||
/**
|
||||
* 校验验证码
|
||||
* @param phone 手机号
|
||||
* @param code 验证码
|
||||
* @return
|
||||
*/
|
||||
boolean check(String phone, String code);
|
||||
|
||||
}
|
||||
|
@ -63,14 +63,14 @@ public interface SysUserService extends IService<SysUser> {
|
||||
* @param userDto 用户信息
|
||||
* @return Boolean 操作成功返回true,操作失败返回false
|
||||
*/
|
||||
Boolean updateUserInfo(UserDTO userDto);
|
||||
R<Boolean> updateUserInfo(UserDTO userDto);
|
||||
|
||||
/**
|
||||
* 更新指定用户信息
|
||||
* @param userDto 用户信息
|
||||
* @return
|
||||
*/
|
||||
Boolean updateUser(UserDTO userDto);
|
||||
R<Boolean> updateUser(UserDTO userDto);
|
||||
|
||||
/**
|
||||
* 通过ID查询用户信息
|
||||
|
@ -17,10 +17,7 @@
|
||||
|
||||
package com.pig4cloud.pig.admin.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.pig4cloud.pig.admin.api.entity.SysUser;
|
||||
import com.pig4cloud.pig.admin.mapper.SysUserMapper;
|
||||
import com.pig4cloud.pig.admin.service.AppService;
|
||||
import com.pig4cloud.pig.common.core.constant.CacheConstants;
|
||||
@ -34,7 +31,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
@ -61,13 +58,6 @@ public class AppServiceImpl implements AppService {
|
||||
*/
|
||||
@Override
|
||||
public R<Boolean> sendSmsCode(String phone) {
|
||||
List<SysUser> userList = userMapper.selectList(Wrappers.<SysUser>query().lambda().eq(SysUser::getPhone, phone));
|
||||
|
||||
if (CollUtil.isEmpty(userList)) {
|
||||
log.info("手机号未注册:{}", phone);
|
||||
return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_PHONE_UNREGISTERED, phone));
|
||||
}
|
||||
|
||||
Object codeObj = redisTemplate.opsForValue().get(CacheConstants.DEFAULT_CODE_KEY + phone);
|
||||
|
||||
if (codeObj != null) {
|
||||
@ -85,4 +75,20 @@ public class AppServiceImpl implements AppService {
|
||||
return R.ok(Boolean.TRUE, code);
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验验证码
|
||||
* @param phone 手机号
|
||||
* @param code 验证码
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean check(String phone, String code) {
|
||||
Object codeObj = redisTemplate.opsForValue().get(CacheConstants.DEFAULT_CODE_KEY + phone);
|
||||
|
||||
if (Objects.isNull(codeObj)) {
|
||||
return false;
|
||||
}
|
||||
return codeObj.equals(code);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -30,6 +30,7 @@ import com.pig4cloud.pig.admin.api.util.ParamResolver;
|
||||
import com.pig4cloud.pig.admin.api.vo.UserExcelVO;
|
||||
import com.pig4cloud.pig.admin.api.vo.UserVO;
|
||||
import com.pig4cloud.pig.admin.mapper.*;
|
||||
import com.pig4cloud.pig.admin.service.AppService;
|
||||
import com.pig4cloud.pig.admin.service.SysMenuService;
|
||||
import com.pig4cloud.pig.admin.service.SysUserService;
|
||||
import com.pig4cloud.pig.common.core.constant.CacheConstants;
|
||||
@ -65,6 +66,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
||||
|
||||
private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder();
|
||||
|
||||
private final AppService appService;
|
||||
|
||||
private final SysRoleMapper sysRoleMapper;
|
||||
|
||||
private final SysDeptMapper sysDeptMapper;
|
||||
@ -171,26 +174,33 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
||||
|
||||
@Override
|
||||
@CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username")
|
||||
public Boolean updateUserInfo(UserDTO userDto) {
|
||||
public R<Boolean> updateUserInfo(UserDTO userDto) {
|
||||
UserVO userVO = baseMapper.getUserVoByUsername(userDto.getUsername());
|
||||
|
||||
Assert.isTrue(ENCODER.matches(userDto.getPassword(), userVO.getPassword()),
|
||||
MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR));
|
||||
// 判断手机号是否修改,更新手机号校验验证码
|
||||
if (!StrUtil.equals(userVO.getPhone(), userDto.getPhone())) {
|
||||
if (!appService.check(userDto.getPhone(), userDto.getCode())) {
|
||||
return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_APP_SMS_ERROR));
|
||||
}
|
||||
}
|
||||
|
||||
// 修改密码逻辑
|
||||
SysUser sysUser = new SysUser();
|
||||
if (StrUtil.isNotBlank(userDto.getNewpassword1())) {
|
||||
Assert.isTrue(ENCODER.matches(userDto.getPassword(), userVO.getPassword()),
|
||||
MsgUtils.getMessage(ErrorCodes.SYS_USER_UPDATE_PASSWORDERROR));
|
||||
sysUser.setPassword(ENCODER.encode(userDto.getNewpassword1()));
|
||||
}
|
||||
sysUser.setPhone(userDto.getPhone());
|
||||
sysUser.setUserId(userVO.getUserId());
|
||||
sysUser.setAvatar(userDto.getAvatar());
|
||||
return this.updateById(sysUser);
|
||||
return R.ok(this.updateById(sysUser));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username")
|
||||
public Boolean updateUser(UserDTO userDto) {
|
||||
public R<Boolean> updateUser(UserDTO userDto) {
|
||||
SysUser sysUser = new SysUser();
|
||||
BeanUtils.copyProperties(userDto, sysUser);
|
||||
sysUser.setUpdateTime(LocalDateTime.now());
|
||||
@ -215,7 +225,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
||||
userPost.setPostId(postId);
|
||||
userPost.insert();
|
||||
});
|
||||
return Boolean.TRUE;
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -366,6 +376,11 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
||||
*/
|
||||
@Override
|
||||
public R<Boolean> registerUser(UserDTO userDto) {
|
||||
// 校验验证码
|
||||
if (!appService.check(userDto.getPhone(), userDto.getCode())) {
|
||||
return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_APP_SMS_ERROR));
|
||||
}
|
||||
|
||||
// 判断用户名是否存在
|
||||
SysUser sysUser = this.getOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUsername, userDto.getUsername()));
|
||||
if (sysUser != null) {
|
||||
|
2
pom.xml
2
pom.xml
@ -27,7 +27,7 @@
|
||||
<url>https://www.pig4cloud.com</url>
|
||||
|
||||
<properties>
|
||||
<spring-boot.version>2.7.3</spring-boot.version>
|
||||
<spring-boot.version>2.7.4</spring-boot.version>
|
||||
<spring-cloud.version>2021.0.4</spring-cloud.version>
|
||||
<spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
Loading…
Reference in New Issue
Block a user