refactor: 扩展 spring security 实现微信一键登录认证
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ public class User extends BaseEntity {
|
||||
private Integer isDeleted;
|
||||
|
||||
/**
|
||||
* 微信openid
|
||||
* 微信 OpenID
|
||||
*/
|
||||
private String openId;
|
||||
private String openid;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user