个人信息修改

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; package cn.stylefeng.roses.kernel.auth.api.password;
import cn.stylefeng.roses.kernel.auth.api.pojo.password.SaltedEncryptResult;
/** /**
* api * api
* *
@ -42,6 +44,16 @@ public interface PasswordStoredEncryptApi {
*/ */
String encrypt(String originPassword); 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); 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) { if (checkResult) {
@ -323,7 +324,7 @@ public class LoginService {
String userTempSecretKey = tempSecretApi.getUserTempSecretKey(userValidateInfo.getUserId()); String userTempSecretKey = tempSecretApi.getUserTempSecretKey(userValidateInfo.getUserId());
// 如果用户有临时秘钥,则校验秘钥是否正确 // 如果用户有临时秘钥,则校验秘钥是否正确
if (StrUtil.isNotBlank(userTempSecretKey)) { if (StrUtil.isNotBlank(userTempSecretKey)) {
Boolean checkTempKeyResult = passwordStoredEncryptApi.checkPassword(loginRequest.getPassword(), userTempSecretKey); boolean checkTempKeyResult = loginRequest.getPassword().equals(userTempSecretKey);
if (checkTempKeyResult) { if (checkTempKeyResult) {
return; return;
} }

View File

@ -24,9 +24,12 @@
*/ */
package cn.stylefeng.roses.kernel.auth.password; package cn.stylefeng.roses.kernel.auth.password;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.digest.BCrypt; import cn.hutool.crypto.digest.BCrypt;
import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi; import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi;
import cn.stylefeng.roses.kernel.auth.api.pojo.password.SaltedEncryptResult;
/** /**
* BCrypt * BCrypt
@ -45,9 +48,30 @@ public class BcryptPasswordStoredEncrypt implements PasswordStoredEncryptApi {
return BCrypt.hashpw(originPassword, BCrypt.gensalt()); 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 @Override
public Boolean checkPassword(String encryptBefore, String encryptAfter) { public Boolean checkPassword(String encryptBefore, String encryptAfter) {
return BCrypt.checkpw(encryptBefore, 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 SUPER_ADMIN_ROLE_CODE = "superAdmin";
/**
*
*/
String DEFAULT_ROLE_CODE = "employee";
/** /**
* *
*/ */

View File

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

View File

@ -82,14 +82,15 @@ public class UserIntegrationService implements SysUserServiceApi {
public UserValidateDTO getUserLoginValidateDTO(String account) { public UserValidateDTO getUserLoginValidateDTO(String account) {
LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysUserLambdaQueryWrapper.eq(SysUser::getAccount, account); 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); SysUser sysUserServiceOne = this.sysUserService.getOne(sysUserLambdaQueryWrapper, false);
if (sysUserServiceOne == null) { if (sysUserServiceOne == null) {
throw new ServiceException(SysUserExceptionEnum.ACCOUNT_NOT_EXIST); 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 @Override

View File

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

View File

@ -80,4 +80,12 @@ public interface SysUserRoleService extends IService<SysUserRole>, SysUserRoleSe
*/ */
void bindRoles(SysUserRoleRequest sysUserRoleRequest); 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.factory.PageResultFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; 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.RemoveRoleCallbackApi;
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveUserCallbackApi; import cn.stylefeng.roses.kernel.sys.api.callback.RemoveUserCallbackApi;
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; 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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -34,6 +36,9 @@ import java.util.stream.Collectors;
public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements SysUserRoleService, public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements SysUserRoleService,
RemoveUserCallbackApi, RemoveRoleCallbackApi { RemoveUserCallbackApi, RemoveRoleCallbackApi {
@Resource
private SysRoleServiceApi sysRoleServiceApi;
@Override @Override
public void add(SysUserRoleRequest sysUserRoleRequest) { public void add(SysUserRoleRequest sysUserRoleRequest) {
SysUserRole sysUserRole = new SysUserRole(); SysUserRole sysUserRole = new SysUserRole();
@ -86,6 +91,19 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
this.saveBatch(newUserRoles); 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 @Override
public List<SysUserRole> findList(SysUserRoleRequest sysUserRoleRequest) { public List<SysUserRole> findList(SysUserRoleRequest sysUserRoleRequest) {
LambdaQueryWrapper<SysUserRole> wrapper = this.createWrapper(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.context.LoginContext;
import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi; 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.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.PageFactory;
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory; import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity; 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); 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); 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()); sysUserOrgService.updateUserOrg(sysUser.getUserId(), sysUserRequest.getUserOrgList());
// 添加用户一个默认角色 todo // 添加用户一个默认角色
sysUserRoleService.bindUserDefaultRole(sysUser.getUserId());
} }
@Override @Override
@ -147,8 +150,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
LambdaQueryWrapper<SysUser> wrapper = createWrapper(sysUserRequest); LambdaQueryWrapper<SysUser> wrapper = createWrapper(sysUserRequest);
// 只查询需要的字段 // 只查询需要的字段
wrapper.select(SysUser::getUserId, SysUser::getRealName, SysUser::getAccount, SysUser::getSex, wrapper.select(SysUser::getUserId, SysUser::getRealName, SysUser::getAccount, SysUser::getSex, SysUser::getStatusFlag,
SysUser::getStatusFlag, BaseEntity::getCreateTime); BaseEntity::getCreateTime);
// 分页查询 // 分页查询
Page<SysUser> sysUserPage = this.page(PageFactory.defaultPage(), wrapper); Page<SysUser> sysUserPage = this.page(PageFactory.defaultPage(), wrapper);
@ -182,7 +185,11 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 获取系统配置的默认密码 // 获取系统配置的默认密码
String password = SysConfigExpander.getDefaultPassWord(); 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); this.updateById(sysUser);
} }
@ -234,8 +241,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 如果传递了组织机构id查询条件则查询对应机构id下有哪些用户再拼接用户查询条件 // 如果传递了组织机构id查询条件则查询对应机构id下有哪些用户再拼接用户查询条件
if (ObjectUtil.isNotEmpty(sysUserRequest.getOrgIdCondition())) { if (ObjectUtil.isNotEmpty(sysUserRequest.getOrgIdCondition())) {
List<Long> orgUserIdList = this.sysUserOrgService.getOrgUserIdList(sysUserRequest.getOrgIdCondition(), List<Long> orgUserIdList = this.sysUserOrgService.getOrgUserIdList(sysUserRequest.getOrgIdCondition(), true);
true);
queryWrapper.in(SysUser::getUserId, orgUserIdList); queryWrapper.in(SysUser::getUserId, orgUserIdList);
} }
@ -250,8 +256,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
*/ */
private void baseRemoveUser(Set<Long> userIdList) { private void baseRemoveUser(Set<Long> userIdList) {
// 校验是否有其他业务绑定了用户信息 // 校验是否有其他业务绑定了用户信息
Map<String, RemoveUserCallbackApi> removeUserCallbackApiMap = SpringUtil.getBeansOfType( Map<String, RemoveUserCallbackApi> removeUserCallbackApiMap = SpringUtil.getBeansOfType(RemoveUserCallbackApi.class);
RemoveUserCallbackApi.class);
for (RemoveUserCallbackApi removeUserCallbackApi : removeUserCallbackApiMap.values()) { for (RemoveUserCallbackApi removeUserCallbackApi : removeUserCallbackApiMap.values()) {
removeUserCallbackApi.validateHaveUserBind(userIdList); removeUserCallbackApi.validateHaveUserBind(userIdList);
} }

View File

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

View File

@ -1,6 +1,7 @@
package cn.stylefeng.roses.kernel.sys.modular.role.service; package cn.stylefeng.roses.kernel.sys.modular.role.service;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; 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.entity.SysRole;
import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.SysRoleRequest; import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.SysRoleRequest;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
@ -13,7 +14,7 @@ import java.util.List;
* @author fengshuonan * @author fengshuonan
* @date 2023/06/10 21:29 * @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.enums.YesOrNotEnum;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; 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.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.entity.SysRole;
import cn.stylefeng.roses.kernel.sys.modular.role.enums.exception.SysRoleExceptionEnum; import cn.stylefeng.roses.kernel.sys.modular.role.enums.exception.SysRoleExceptionEnum;
import cn.stylefeng.roses.kernel.sys.modular.role.mapper.SysRoleMapper; 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); 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); this.removeBatchByIds(roleIdList);
} }
} }