个人信息修改

pull/57/head
Liyanjun 2023-06-25 09:29:30 +08:00
commit f3e595adf5
15 changed files with 200 additions and 20 deletions

View File

@ -24,6 +24,8 @@
*/
package cn.stylefeng.roses.kernel.auth.api.password;
import cn.stylefeng.roses.kernel.auth.api.pojo.password.SaltedEncryptResult;
/**
* api
*
@ -42,6 +44,16 @@ public interface PasswordStoredEncryptApi {
*/
String encrypt(String originPassword);
/**
* +
*
* @param originPassword
* @return
* @author fengshuonan
* @since 2023/6/25 8:49
*/
SaltedEncryptResult encryptWithSalt(String originPassword);
/**
*
*
@ -52,4 +64,12 @@ public interface PasswordStoredEncryptApi {
*/
Boolean checkPassword(String encryptBefore, String encryptAfter);
/**
* +
*
* @author fengshuonan
* @since 2023/6/25 8:51
*/
Boolean checkPasswordWithSalt(String encryptBefore, String passwordSalt, String encryptAfter);
}

View File

@ -0,0 +1,24 @@
package cn.stylefeng.roses.kernel.auth.api.pojo.password;
import lombok.Data;
/**
*
*
* @author fengshuonan
* @since 2023/6/25 8:48
*/
@Data
public class SaltedEncryptResult {
/**
*
*/
private String encryptPassword;
/**
*
*/
private String passwordSalt;
}

View File

@ -308,7 +308,8 @@ public class LoginService {
}
// 如果本次登录需要校验密码
Boolean checkResult = passwordStoredEncryptApi.checkPassword(loginRequest.getPassword(), userValidateInfo.getUserPasswordHexed());
Boolean checkResult = passwordStoredEncryptApi.checkPasswordWithSalt(loginRequest.getPassword(),
userValidateInfo.getUserPasswordSalt(), userValidateInfo.getUserPasswordHexed());
// 校验用户表密码是否正确,如果正确则直接返回
if (checkResult) {
@ -323,7 +324,7 @@ public class LoginService {
String userTempSecretKey = tempSecretApi.getUserTempSecretKey(userValidateInfo.getUserId());
// 如果用户有临时秘钥,则校验秘钥是否正确
if (StrUtil.isNotBlank(userTempSecretKey)) {
Boolean checkTempKeyResult = passwordStoredEncryptApi.checkPassword(loginRequest.getPassword(), userTempSecretKey);
boolean checkTempKeyResult = loginRequest.getPassword().equals(userTempSecretKey);
if (checkTempKeyResult) {
return;
}

View File

@ -24,9 +24,12 @@
*/
package cn.stylefeng.roses.kernel.auth.password;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.digest.BCrypt;
import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi;
import cn.stylefeng.roses.kernel.auth.api.pojo.password.SaltedEncryptResult;
/**
* BCrypt
@ -45,9 +48,30 @@ public class BcryptPasswordStoredEncrypt implements PasswordStoredEncryptApi {
return BCrypt.hashpw(originPassword, BCrypt.gensalt());
}
@Override
public SaltedEncryptResult encryptWithSalt(String originPassword) {
SaltedEncryptResult saltedEncryptResult = new SaltedEncryptResult();
// 创建密码盐
String salt = RandomUtil.randomString(8);
saltedEncryptResult.setPasswordSalt(salt);
// 将原密码进行md5加密
String encryptAfter = SecureUtil.md5(originPassword + salt);
saltedEncryptResult.setEncryptPassword(encryptAfter);
return saltedEncryptResult;
}
@Override
public Boolean checkPassword(String encryptBefore, String encryptAfter) {
return BCrypt.checkpw(encryptBefore, encryptAfter);
}
@Override
public Boolean checkPasswordWithSalt(String encryptBefore, String passwordSalt, String encryptAfter) {
return SecureUtil.md5(encryptBefore + passwordSalt).equals(encryptAfter);
}
}

View File

@ -0,0 +1,45 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* 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.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.sys.api;
/**
* Api
*
* @author fengshuonan
* @since 2023/6/25 0:35
*/
public interface SysRoleServiceApi {
/**
* idemployeeid
* <p>
*
*
* @author fengshuonan
* @since 2023/6/25 0:35
*/
Long getDefaultRoleId();
}

View File

@ -52,6 +52,11 @@ public interface SysConstants {
*/
String SUPER_ADMIN_ROLE_CODE = "superAdmin";
/**
*
*/
String DEFAULT_ROLE_CODE = "employee";
/**
*
*/

View File

@ -48,6 +48,12 @@ public class UserValidateDTO {
@ChineseDescription("加密后的密码")
private String userPasswordHexed;
/**
* sys_userpassword_salt
*/
@ChineseDescription("加密后的密码")
private String userPasswordSalt;
/**
* UserStatusEnum
*/
@ -57,9 +63,10 @@ public class UserValidateDTO {
public UserValidateDTO() {
}
public UserValidateDTO(Long userId, String userPasswordHexed, Integer userStatus) {
public UserValidateDTO(Long userId, String userPasswordHexed, String salt, Integer userStatus) {
this.userId = userId;
this.userPasswordHexed = userPasswordHexed;
this.userPasswordSalt = salt;
this.userStatus = userStatus;
}

View File

@ -82,14 +82,15 @@ public class UserIntegrationService implements SysUserServiceApi {
public UserValidateDTO getUserLoginValidateDTO(String account) {
LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysUserLambdaQueryWrapper.eq(SysUser::getAccount, account);
sysUserLambdaQueryWrapper.select(SysUser::getPassword, SysUser::getStatusFlag, SysUser::getUserId);
sysUserLambdaQueryWrapper.select(SysUser::getPassword, SysUser::getPasswordSalt, SysUser::getStatusFlag, SysUser::getUserId);
SysUser sysUserServiceOne = this.sysUserService.getOne(sysUserLambdaQueryWrapper, false);
if (sysUserServiceOne == null) {
throw new ServiceException(SysUserExceptionEnum.ACCOUNT_NOT_EXIST);
}
return new UserValidateDTO(sysUserServiceOne.getUserId(), sysUserServiceOne.getPassword(), sysUserServiceOne.getStatusFlag());
return new UserValidateDTO(sysUserServiceOne.getUserId(), sysUserServiceOne.getPassword(), sysUserServiceOne.getPasswordSalt(),
sysUserServiceOne.getStatusFlag());
}
@Override

View File

@ -58,12 +58,19 @@ public class SysUser extends BaseExpandFieldEntity {
private String account;
/**
* BCrypt
* md5+
*/
@TableField("password")
@ChineseDescription("密码,加密方式为BCrypt")
@ChineseDescription("密码,加密方式md5+盐")
private String password;
/**
* md5+
*/
@TableField("password_salt")
@ChineseDescription("密码盐加密方式md5+盐")
private String passwordSalt;
/**
* id
*/

View File

@ -80,4 +80,12 @@ public interface SysUserRoleService extends IService<SysUserRole>, SysUserRoleSe
*/
void bindRoles(SysUserRoleRequest sysUserRoleRequest);
/**
*
*
* @author fengshuonan
* @since 2023/6/25 0:34
*/
void bindUserDefaultRole(Long userId);
}

View File

@ -6,6 +6,7 @@ import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import cn.stylefeng.roses.kernel.sys.api.SysRoleServiceApi;
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveRoleCallbackApi;
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveUserCallbackApi;
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole;
@ -19,6 +20,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@ -34,6 +36,9 @@ import java.util.stream.Collectors;
public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements SysUserRoleService,
RemoveUserCallbackApi, RemoveRoleCallbackApi {
@Resource
private SysRoleServiceApi sysRoleServiceApi;
@Override
public void add(SysUserRoleRequest sysUserRoleRequest) {
SysUserRole sysUserRole = new SysUserRole();
@ -86,6 +91,19 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
this.saveBatch(newUserRoles);
}
@Override
public void bindUserDefaultRole(Long userId) {
// 查询默认角色的角色id
Long defaultRoleId = sysRoleServiceApi.getDefaultRoleId();
// 给用户绑定默认角色
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(userId);
sysUserRole.setRoleId(defaultRoleId);
this.save(sysUserRole);
}
@Override
public List<SysUserRole> findList(SysUserRoleRequest sysUserRoleRequest) {
LambdaQueryWrapper<SysUserRole> wrapper = this.createWrapper(sysUserRoleRequest);

View File

@ -7,6 +7,7 @@ import cn.hutool.extra.spring.SpringUtil;
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.auth.api.pojo.password.SaltedEncryptResult;
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
@ -63,7 +64,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
BeanUtil.copyProperties(sysUserRequest, sysUser);
// 将密码加密存储到库中
sysUser.setPassword(passwordStoredEncryptApi.encrypt(sysUser.getPassword()));
SaltedEncryptResult saltedEncryptResult = passwordStoredEncryptApi.encryptWithSalt(sysUser.getPassword());
sysUser.setPassword(saltedEncryptResult.getEncryptPassword());
sysUser.setPasswordSalt(saltedEncryptResult.getPasswordSalt());
// 设置用户默认头像
sysUser.setAvatar(FileConstants.DEFAULT_AVATAR_FILE_ID);
@ -73,8 +76,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 更新用户的任职信息
sysUserOrgService.updateUserOrg(sysUser.getUserId(), sysUserRequest.getUserOrgList());
// 添加用户一个默认角色 todo
// 添加用户一个默认角色
sysUserRoleService.bindUserDefaultRole(sysUser.getUserId());
}
@Override
@ -147,8 +150,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
LambdaQueryWrapper<SysUser> wrapper = createWrapper(sysUserRequest);
// 只查询需要的字段
wrapper.select(SysUser::getUserId, SysUser::getRealName, SysUser::getAccount, SysUser::getSex,
SysUser::getStatusFlag, BaseEntity::getCreateTime);
wrapper.select(SysUser::getUserId, SysUser::getRealName, SysUser::getAccount, SysUser::getSex, SysUser::getStatusFlag,
BaseEntity::getCreateTime);
// 分页查询
Page<SysUser> sysUserPage = this.page(PageFactory.defaultPage(), wrapper);
@ -182,7 +185,11 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 获取系统配置的默认密码
String password = SysConfigExpander.getDefaultPassWord();
sysUser.setPassword(passwordStoredEncryptApi.encrypt(password));
// 密码加密后,存储到数据库中
SaltedEncryptResult saltedEncryptResult = passwordStoredEncryptApi.encryptWithSalt(password);
sysUser.setPassword(saltedEncryptResult.getEncryptPassword());
sysUser.setPasswordSalt(saltedEncryptResult.getPasswordSalt());
this.updateById(sysUser);
}
@ -234,8 +241,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 如果传递了组织机构id查询条件则查询对应机构id下有哪些用户再拼接用户查询条件
if (ObjectUtil.isNotEmpty(sysUserRequest.getOrgIdCondition())) {
List<Long> orgUserIdList = this.sysUserOrgService.getOrgUserIdList(sysUserRequest.getOrgIdCondition(),
true);
List<Long> orgUserIdList = this.sysUserOrgService.getOrgUserIdList(sysUserRequest.getOrgIdCondition(), true);
queryWrapper.in(SysUser::getUserId, orgUserIdList);
}
@ -250,8 +256,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
*/
private void baseRemoveUser(Set<Long> userIdList) {
// 校验是否有其他业务绑定了用户信息
Map<String, RemoveUserCallbackApi> removeUserCallbackApiMap = SpringUtil.getBeansOfType(
RemoveUserCallbackApi.class);
Map<String, RemoveUserCallbackApi> removeUserCallbackApiMap = SpringUtil.getBeansOfType(RemoveUserCallbackApi.class);
for (RemoveUserCallbackApi removeUserCallbackApi : removeUserCallbackApiMap.values()) {
removeUserCallbackApi.validateHaveUserBind(userIdList);
}

View File

@ -356,7 +356,6 @@ public class UserIndexInfoService {
*
* @param loginUser
* @param appId id
* @return true-false-
* @author fengshuonan
* @since 2023/6/21 16:23
*/

View File

@ -1,6 +1,7 @@
package cn.stylefeng.roses.kernel.sys.modular.role.service;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.sys.api.SysRoleServiceApi;
import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRole;
import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.SysRoleRequest;
import com.baomidou.mybatisplus.extension.service.IService;
@ -13,7 +14,7 @@ import java.util.List;
* @author fengshuonan
* @date 2023/06/10 21:29
*/
public interface SysRoleService extends IService<SysRole> {
public interface SysRoleService extends IService<SysRole>, SysRoleServiceApi {
/**
*

View File

@ -12,6 +12,7 @@ import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveRoleCallbackApi;
import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants;
import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRole;
import cn.stylefeng.roses.kernel.sys.modular.role.enums.exception.SysRoleExceptionEnum;
import cn.stylefeng.roses.kernel.sys.modular.role.mapper.SysRoleMapper;
@ -117,6 +118,21 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
return this.list(wrapper);
}
@Override
public Long getDefaultRoleId() {
LambdaQueryWrapper<SysRole> sysRoleLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysRoleLambdaQueryWrapper.eq(SysRole::getRoleCode, SysConstants.DEFAULT_ROLE_CODE);
sysRoleLambdaQueryWrapper.select(SysRole::getRoleId);
SysRole sysRole = this.getOne(sysRoleLambdaQueryWrapper, false);
if (sysRole != null) {
return sysRole.getRoleId();
}
return null;
}
/**
*
*
@ -174,5 +190,4 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
// 删除角色
this.removeBatchByIds(roleIdList);
}
}