refactor: 扩展 spring security 实现微信一键登录认证

This commit is contained in:
haoxr
2024-12-03 17:15:58 +08:00
parent db3da6b1dc
commit f3a32821ea
13 changed files with 391 additions and 102 deletions

View File

@@ -48,6 +48,14 @@ public interface UserMapper extends BaseMapper<User> {
*/
UserAuthInfo getUserAuthInfo(String username);
/**
* 根据微信openid获取用户认证信息
*
* @param openid 微信openid
* @return
*/
UserAuthInfo getUserAuthInfoByOpenId(String openid);
/**
* 获取导出用户列表
*
@@ -64,4 +72,6 @@ public interface UserMapper extends BaseMapper<User> {
* @return
*/
UserBO getUserProfile(Long userId);
}

View File

@@ -7,29 +7,57 @@ import java.util.Set;
/**
* 用户认证信息
*
* @author haoxr
* @author Ray.Hao
* @since 2022/10/22
*
*/
@Data
public class UserAuthInfo {
/**
* 用户ID
*/
private Long userId;
/**
* 用户名
*/
private String username;
/**
* 昵称
*/
private String nickname;
/**
* 部门ID
*/
private Long deptId;
/**
* 用户密码
*/
private String password;
/**
* 状态1:启用0:禁用)
*/
private Integer status;
/**
* 用户所属的角色集合
*/
private Set<String> roles;
/**
* 用户拥有的权限集合
*/
private Set<String> perms;
/**
* 数据权限范围,用于控制用户可以访问的数据级别
*
* @see com.youlai.boot.common.enums.DataScopeEnum
*/
private Integer dataScope;
}

View File

@@ -74,7 +74,7 @@ public class User extends BaseEntity {
private Integer isDeleted;
/**
* 微信openid
* 微信 OpenID
*/
private String openId;
private String openid;
}

View File

@@ -160,10 +160,18 @@ public interface UserService extends IService<User> {
List<Option<String>> listUserOptions();
/**
* 根据openId获取用户信息
* 根据 openid 获取用户认证信息
*
* @param openId openId
* @return {@link User}
* @param username 用户名
* @return {@link UserAuthInfo}
*/
User getUserByOpenId(String openId);
UserAuthInfo getUserAuthInfoByOpenId(String username);
/**
* 根据微信 OpenID 注册或绑定用户
*
* @param openId 微信 OpenID
*/
void registerOrBindWechatUser(String openId);
}

View File

@@ -35,7 +35,6 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
public class ConfigServiceImpl extends ServiceImpl<ConfigMapper, Config> implements ConfigService {
private final ConfigMapper configMapper;
private final ConfigConverter configConverter;

View File

@@ -16,6 +16,7 @@ import com.youlai.boot.common.model.Option;
import com.youlai.boot.shared.mail.service.MailService;
import com.youlai.boot.shared.sms.service.SmsService;
import com.youlai.boot.system.model.entity.User;
import com.youlai.boot.system.model.entity.UserRole;
import com.youlai.boot.system.model.form.*;
import com.youlai.boot.config.property.AliyunSmsProperties;
import com.youlai.boot.system.converter.UserConverter;
@@ -61,8 +62,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
private final UserRoleService userRoleService;
private final UserConverter userConverter;
private final RoleMenuService roleMenuService;
private final RoleService roleService;
@@ -79,6 +78,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
private final TokenService tokenService;
private final UserConverter userConverter;
/**
* 获取用户分页列表
*
@@ -214,11 +215,63 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
}
/**
* 根据 openid 获取用户认证信息
*
* @param openid 微信
* @return {@link UserAuthInfo}
*/
@Override
public UserAuthInfo getUserAuthInfoByOpenId(String openid) {
UserAuthInfo userAuthInfo = this.baseMapper.getUserAuthInfoByOpenId(openid);
if (userAuthInfo != null) {
Set<String> roles = userAuthInfo.getRoles();
if (CollectionUtil.isNotEmpty(roles)) {
Set<String> perms = roleMenuService.getRolePermsByRoleCodes(roles);
userAuthInfo.setPerms(perms);
}
// 获取最大范围的数据权限
Integer dataScope = roleService.getMaximumDataScope(roles);
userAuthInfo.setDataScope(dataScope);
}
return userAuthInfo;
}
/**
* 根据微信 OpenID 注册或绑定用户
* <p>
* TODO 根据手机号绑定用户
*
* @param openId 微信 OpenID
*/
@Override
public void registerOrBindWechatUser(String openId) {
User user = this.getOne(
new LambdaQueryWrapper<User>().eq(User::getOpenid, openId)
);
if (user == null) {
user = new User();
user.setNickname("微信用户"); // 默认昵称
user.setUsername(openId); // TODO 后续替换为手机号
user.setOpenid(openId);
user.setGender(0); // 保密
user.setUpdateBy(SecurityUtils.getUserId());
user.setPassword(SystemConstants.DEFAULT_PASSWORD);
this.save(user);
// 为了默认系统管理员角色,这里按需调整,实际情况绑定已存在的系统用户,另一种情况是给默认游客角色,然后由系统管理员设置用户的角色
UserRole userRole = new UserRole();
userRole.setUserId(user.getId());
userRole.setRoleId(1L); // TODO 系统管理员
userRoleService.save(userRole);
}
}
/**
* 获取导出用户列表
*
* @param queryParams 查询参数
* @return {@link List< UserExportDTO >} 导出用户列表
* @return {@link List<UserExportDTO>} 导出用户列表
*/
@Override
public List<UserExportDTO> listExportUsers(UserPageQuery queryParams) {
@@ -319,7 +372,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
.set(User::getPassword, passwordEncoder.encode(newPassword))
);
if(result){
if (result) {
// 加入黑名单,重新登录
String accessToken = SecurityUtils.getTokenFromRequest();
tokenService.blacklistToken(accessToken);
@@ -458,14 +511,4 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
return Collections.emptyList();
}
/**
* 根据openId获取用户信息
*
* @param openId openId
* @return {@link User}
*/
@Override
public User getUserByOpenId(String openId) {
return this.getOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, openId));
}
}