接入第三方登录(已接入Gitee[理论justAuth支持都可以接入]--抢先预览版

This commit is contained in:
weir
2021-08-13 23:44:52 +08:00
parent c588a4d975
commit 133cb49c42
27 changed files with 1049 additions and 44 deletions

View File

@@ -1,5 +1,6 @@
package cn.iocoder.yudao.adminserver.modules.system.controller.auth;
import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
@@ -19,6 +20,8 @@ import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -46,6 +49,8 @@ public class SysAuthController {
private SysRoleService roleService;
@Resource
private SysPermissionService permissionService;
@Resource
private SysUserSessionService sysUserSessionService;
@PostMapping("/login")
@ApiOperation("使用账号密码登录")
@@ -56,6 +61,17 @@ public class SysAuthController {
return success(SysAuthLoginRespVO.builder().token(token).build());
}
@RequestMapping("/auth2/login/{oauthType}")
@ApiOperation("第三方登录")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<SysAuthLoginRespVO> login(@PathVariable String oauthType) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
//TODO NPE
String token = sysUserSessionService.getSessionId(authentication.getName());
// 返回结果
return success(SysAuthLoginRespVO.builder().token(token).build());
}
@GetMapping("/get-permission-info")
@ApiOperation("获取登陆用户的权限信息")
public CommonResult<SysAuthPermissionInfoRespVO> getPermissionInfo() {

View File

@@ -0,0 +1,7 @@
package cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user;
/**
* @author weir
*/
public class AuthUser {
}

View File

@@ -1,5 +1,8 @@
package cn.iocoder.yudao.adminserver.modules.system.convert.auth;
import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
import cn.iocoder.yudao.framework.security.core.Auth2LoginUser;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO;
import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO;
@@ -10,8 +13,9 @@ import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.Sys
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuIdEnum;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import me.zhyd.oauth.enums.AuthUserGender;
import me.zhyd.oauth.model.AuthUser;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;
import org.slf4j.LoggerFactory;
@@ -21,7 +25,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Mapper
@Mapper(uses = SysAuthConvert.UserSexTransform.class)
public interface SysAuthConvert {
SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class);
@@ -29,6 +33,7 @@ public interface SysAuthConvert {
@Mapping(source = "updateTime", target = "updateTime", ignore = true)
// 字段相同,但是含义不同,忽略
LoginUser convert(SysUserDO bean);
Auth2LoginUser getAuth2LoginUser(SysUserDO bean);
default SysAuthPermissionInfoRespVO convert(SysUserDO user, List<SysRoleDO> roleList, List<SysMenuDO> menuList) {
return SysAuthPermissionInfoRespVO.builder()
@@ -44,6 +49,16 @@ public interface SysAuthConvert {
LoginUser convert(SysUserProfileUpdatePasswordReqVO reqVO);
@Mappings(
@Mapping(target = "sex", source = "gender")
)
SysUserCreateReqVO convert(AuthUser authUser);
@Mappings(
@Mapping(target = "thirdPartyUserId", source = "uuid")
)
Auth2LoginUser getLoginUser(AuthUser authUser);
/**
* 将菜单列表,构建成菜单树
*
@@ -76,4 +91,24 @@ public interface SysAuthConvert {
return CollectionUtils.filterList(treeNodeMap.values(), node -> MenuIdEnum.ROOT.getId().equals(node.getParentId()));
}
public class UserSexTransform {
public int toInt (AuthUserGender gender){
switch (gender) {
case MALE:
return SysSexEnum.MALE.getSex();
case FEMALE:
return SysSexEnum.FEMALE.getSex();
default:
return SysSexEnum.UNKNOWN.getSex();
}
}
public AuthUserGender strToBoolean(int sex){
if(sex == SysSexEnum.UNKNOWN.getSex()) {
return AuthUserGender.UNKNOWN;
}
return AuthUserGender.getRealGender(String.valueOf(sex));
}
}
}

View File

@@ -0,0 +1,19 @@
package cn.iocoder.yudao.adminserver.modules.system.convert.auth.config;
import cn.iocoder.yudao.adminserver.modules.system.convert.auth.handler.DefaultSignUpUrlAuthenticationSuccessHandler;
import cn.iocoder.yudao.framework.security.core.handler.AbstractSignUpUrlAuthenticationSuccessHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author weir
*/
@Configuration
public class AuthConfig {
@Bean
public AbstractSignUpUrlAuthenticationSuccessHandler authenticationSuccessHandler() {
AbstractSignUpUrlAuthenticationSuccessHandler successHandler = new DefaultSignUpUrlAuthenticationSuccessHandler();
successHandler.setDefaultTargetUrl("/api/callback");
return successHandler;
}
}

View File

@@ -0,0 +1,112 @@
/*
* MIT License
* Copyright (c) 2020-2029 YongWu zheng (dcenter.top and gitee.com/pcore and github.com/ZeroOrInfinity)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package cn.iocoder.yudao.adminserver.modules.system.convert.auth.handler;
import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginRespVO;
import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService;
import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.security.core.Auth2LoginUser;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.handler.AbstractSignUpUrlAuthenticationSuccessHandler;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.DefaultRedirectStrategy;
import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
import org.springframework.security.web.savedrequest.RequestCache;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUserAgent;
import static java.util.Collections.singleton;
import static top.dcenter.ums.security.core.oauth.util.MvcUtil.*;
/**
* @author weir
*/
public class DefaultSignUpUrlAuthenticationSuccessHandler extends AbstractSignUpUrlAuthenticationSuccessHandler {
private RequestCache requestCache = new HttpSessionRequestCache();
@Autowired
private SysUserSessionService userSessionService;
@Resource
private SysPermissionService permissionService;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException {
final Object principal = authentication.getPrincipal();
String token = userSessionService.createUserSession(defaultHandleUserRoles((LoginUser) principal), getClientIP(), getUserAgent());
if(StringUtils.isNotBlank(token)) {
SecurityContextHolder.getContext().setAuthentication(authentication);
}
if (principal instanceof Auth2LoginUser) {
new DefaultRedirectStrategy().sendRedirect(request, response, getUrl() + token);
return;
}
if (isAjaxOrJson(request)) {
responseWithJson(response, HttpStatus.OK.value(), toJsonString(success(SysAuthLoginRespVO.builder().token(token).build())));
return;
}
try {
requestCache.saveRequest(request, response);
super.setRequestCache(requestCache);
super.onAuthenticationSuccess(request, response, authentication);
} catch (ServletException e) {
e.printStackTrace();
}
}
private String getUrl() {
return "http://localhost/oauthLogin/gitee?token=";
}
/**
* 默认处理方式处理用户角色列表;建议角色权限前置到 UserDetails
*
* @param loginUser 用户
* @return
*/
private LoginUser defaultHandleUserRoles(LoginUser loginUser) {
Set<Long> roleIds = loginUser.getRoleIds();
if (roleIds == null || roleIds.isEmpty()) {
Set<Long> userRoleIds = permissionService.getUserRoleIds(loginUser.getId(), singleton(CommonStatusEnum.ENABLE.getStatus()));
loginUser.setRoleIds(userRoleIds);
}
return loginUser;
}
@Override
public void setRequestCache(RequestCache requestCache) {
this.requestCache = requestCache;
}
}

View File

@@ -0,0 +1,13 @@
package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import me.zhyd.oauth.model.AuthUser;
/**
* @author weir
*/
@Data
@TableName("user_connection")
public class SocialUserDO extends AuthUser {
}

View File

@@ -0,0 +1,31 @@
package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 系统用户和第三方用户关联表
* @author weir
*/
@TableName("sys_user_social")
@Data
public class SysUserSocialDO extends BaseDO {
/**
* 自增主键
*/
@TableId
private Long id;
/**
* 用户 ID
*/
private Long userId;
/**
* 角色 ID
*/
private String socialUserId;
}

View File

@@ -0,0 +1,11 @@
package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.social;
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysUserSocialDO;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SysSysUserSocialMapper extends BaseMapperX<SysUserSocialDO> {
}

View File

@@ -0,0 +1,11 @@
package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.social;
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysUserSocialDO;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SysUserSocialMapper extends BaseMapperX<SysUserSocialDO> {
}

View File

@@ -11,10 +11,12 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum SysSexEnum {
MALE(1), // 男
FEMALE(2); // 女
/** 男 */
MALE(1),
/** 女 */
FEMALE(2),
/* 未知 */
UNKNOWN(3);
/**
* 性别
*/

View File

@@ -45,6 +45,13 @@ public interface SysUserSessionService {
*/
LoginUser getLoginUser(String sessionId);
/**
* 获取当前登录用户信息
* @param username 用户名称
* @return 在线用户
*/
String getSessionId(String username);
/**
* 获得 Session 超时时间,单位:毫秒
*

View File

@@ -18,7 +18,11 @@ import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEn
import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService;
import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -34,6 +38,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime;
*
* @author 芋道源码
*/
@Slf4j
@Service
public class SysUserSessionServiceImpl implements SysUserSessionService {
@@ -91,6 +96,15 @@ public class SysUserSessionServiceImpl implements SysUserSessionService {
return loginUserRedisDAO.get(sessionId);
}
@Override
public String getSessionId(String username) {
QueryWrapper<SysUserSessionDO> wrapper = new QueryWrapper<>();
wrapper.eq("username", username);
wrapper.orderByDesc("create_time");
SysUserSessionDO sysUserSessionDO = userSessionMapper.selectOne(wrapper);
return sysUserSessionDO.getId();
}
@Override
public Long getSessionTimeoutMillis() {
return securityProperties.getSessionTimeout().toMillis();

View File

@@ -0,0 +1,237 @@
/*
* MIT License
* Copyright (c) 2020-2029 YongWu zheng (dcenter.top and gitee.com/pcore and github.com/ZeroOrInfinity)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package cn.iocoder.yudao.adminserver.modules.system.service.auth.impl;
import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert;
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
import cn.iocoder.yudao.framework.security.core.Auth2LoginUser;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import com.google.common.collect.Sets;
import me.zhyd.oauth.model.AuthUser;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.NonNull;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserCache;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import top.dcenter.ums.security.core.oauth.enums.ErrorCodeEnum;
import top.dcenter.ums.security.core.oauth.exception.RegisterUserFailureException;
import top.dcenter.ums.security.core.oauth.exception.UserNotExistException;
import top.dcenter.ums.security.core.oauth.service.UmsUserDetailsService;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 用户密码与手机短信登录与注册服务:<br><br>
* 1. 用于第三方登录与手机短信登录逻辑。<br><br>
* 2. 用于用户密码登录逻辑。<br><br>
* 3. 用户注册逻辑。<br><br>
* @author YongWu zheng
* @version V1.0 Created by 2020/9/20 11:06
*/
@Service
public class UserDetailsServiceImpl implements UmsUserDetailsService {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
@Autowired(required = false)
private UserCache userCache;
@Resource
private SysUserService userService;
/**
* 用于密码加解密
*/
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private SysPermissionService permissionService;
@SuppressWarnings("AlibabaUndefineMagicConstant")
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
try
{
// 从缓存中查询用户信息:
// 从缓存中查询用户信息
if (this.userCache != null)
{
UserDetails userDetails = this.userCache.getUserFromCache(username);
if (userDetails != null)
{
return userDetails;
}
}
// 根据用户名获取用户信息
// 获取 username 对应的 SysUserDO
SysUserDO user = userService.getUserByUsername(username);
if (user == null) {
throw new UsernameNotFoundException(username);
}
// 创建 LoginUser 对象
Auth2LoginUser loginUser = SysAuthConvert.INSTANCE.getAuth2LoginUser(user);
//TODO 登录日志等可以和用户名密码等兼容处理
return loginUser;
}
catch (Exception e)
{
String msg = String.format("第三方登录 ======>: 登录用户名:%s, 登录失败: %s", username, e.getMessage());
log.error(msg);
throw new UserNotExistException(ErrorCodeEnum.QUERY_USER_INFO_ERROR, e, username);
}
}
@Override
public UserDetails registerUser(@NonNull AuthUser authUser, @NonNull String username,
@NonNull String defaultAuthority, String decodeState) throws RegisterUserFailureException {
// 这里的 decodeState 可以根据自己实现的 top.dcenter.ums.security.core.oauth.service.Auth2StateCoder 接口的逻辑来传递必要的参数.
// 比如: 第三方登录成功后的跳转地址
final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
// 假设 decodeState 就是 redirectUrl, 我们直接把 redirectUrl 设置到 request 上
// 后续经过成功处理器时直接从 requestAttributes.getAttribute("redirectUrl", RequestAttributes.SCOPE_REQUEST) 获取并跳转
if (requestAttributes != null) {
requestAttributes.setAttribute("redirectUrl", decodeState, RequestAttributes.SCOPE_REQUEST);
}
//返回用户
LoginUser loginUser = doRegistUser(authUser);
log.info("第三方用户注册 ======>: 用户名:{}, 注册成功", username);
// 把用户信息存入缓存
if (userCache != null)
{
userCache.putUserInCache(loginUser);
}
return loginUser;
}
private LoginUser doRegistUser(AuthUser authUser) {
SysUserCreateReqVO reqVO = SysAuthConvert.INSTANCE.convert(authUser);
if (StringUtils.isEmpty(reqVO.getPassword())) {
reqVO.setPassword(getDefaultPassword());
}
//添加用户
Long sysUserId = userService.createUser(reqVO);
//关联第三方用户
Long userId = userService.bindSocialUSer(sysUserId, authUser.getUuid());
//赋予默认角色权限;三方登录默认部分
permissionService.assignUserRole(userId, getDefaultRoles());
LoginUser loginUser = SysAuthConvert.INSTANCE.getLoginUser(authUser);
loginUser.setRoleIds(getDefaultRoles());
loginUser.setPassword(getDefaultPassword());
loginUser.setId(sysUserId);
return loginUser;
}
private String getDefaultPassword() {
return "123456";
}
protected Set<Long> getDefaultRoles() {
return Sets.newHashSet(1L);
}
@NonNull
public UserDetails registerUser(@NonNull String mobile, Map<String, String> otherParamMap) throws RegisterUserFailureException {
// 用户信息持久化逻辑。。。
// ...
log.info("Demo ======>: 手机短信登录用户 {}:注册成功", mobile);
User user = new User(mobile,
passwordEncoder.encode("admin"),
true,
true,
true,
true,
AuthorityUtils.commaSeparatedStringToAuthorityList("admin, ROLE_USER")
);
// 把用户信息存入缓存
if (userCache != null)
{
userCache.putUserInCache(user);
}
return user;
}
/**
* {@link #existedByUsernames(String...)} usernames 生成规则.
* 如需自定义重新实现此逻辑
* @param authUser 第三方用户信息
* @return 返回一个 username 数组
*/
@Override
public String[] generateUsernames(AuthUser authUser) {
return new String[]{
authUser.getUsername(),
// providerId = authUser.getSource()
authUser.getUsername() + "_" + authUser.getSource(),
// providerUserId = authUser.getUuid()
authUser.getUsername() + "_" + authUser.getSource() + "_" + authUser.getUuid()
};
}
@Override
public UserDetails loadUserByUserId(String userId) throws UsernameNotFoundException {
UserDetails userDetails = loadUserByUsername(userId);
User.withUserDetails(userDetails);
return userDetails;
}
@Override
public List<Boolean> existedByUsernames(String... usernames) throws UsernameNotFoundException {
// ... 在本地账户上查询 userIds 是否已被使用
List<Boolean> list = new ArrayList<>();
for (String username : usernames) {
SysUserDO userDO = userService.getUserByUsername(username);
list.add(userDO != null);
}
return list;
}
}

View File

@@ -34,6 +34,14 @@ public interface SysUserService {
*/
Long createUser(SysUserCreateReqVO reqVO);
/**
* 绑定第三方用户
* @param sysUserId 系统用户ID
* @param socialUSerId 第三方唯一标识
* @return
*/
Long bindSocialUSer(Long sysUserId, String socialUSerId);
/**
* 修改用户
*

View File

@@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysUserSocialDO;
import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.social.SysUserSocialMapper;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -49,6 +51,8 @@ public class SysUserServiceImpl implements SysUserService {
@Resource
private SysUserMapper userMapper;
@Resource
private SysUserSocialMapper userSocialMapper;
@Resource
private SysDeptService deptService;
@@ -74,6 +78,15 @@ public class SysUserServiceImpl implements SysUserService {
return user.getId();
}
@Override
public Long bindSocialUSer(Long sysUserId, String socialUSerId) {
SysUserSocialDO userSocialDO = new SysUserSocialDO();
userSocialDO.setUserId(sysUserId);
userSocialDO.setSocialUserId(socialUSerId);
userSocialMapper.insert(userSocialDO);
return userSocialDO.getUserId();
}
@Override
public void updateUser(SysUserUpdateReqVO reqVO) {
// 校验正确性