Browse Source

chore: Support multi login

master
wangxiang 2 years ago
parent
commit
d97a224bcc
No known key found for this signature in database
GPG Key ID: 1BA7946AB6B232E4
  1. 14
      kicc-auth/src/main/java/com/cloud/kicc/auth/provider/UserProviderTemplateImpl.java
  2. 4
      kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/entity/CasUser.java
  3. 2
      kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/grant/provider/CustomAppAuthenticationProvider.java
  4. 2
      kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/grant/provider/KiccDaoAuthenticationProvider.java
  5. 1
      kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/service/KiccUserDetailsService.java
  6. 8
      kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteAppService.java
  7. 5
      kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteDictService.java
  8. 8
      kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteSsoUserService.java
  9. 16
      kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/AppController.java
  10. 15
      kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/DictDataController.java
  11. 8
      kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/SsoUserController.java

14
kicc-auth/src/main/java/com/cloud/kicc/auth/provider/UserProviderTemplateImpl.java

@ -24,11 +24,8 @@ public class UserProviderTemplateImpl implements UserProviderTemplate<KiccUser>
@Override @Override
public SsoUser selectByUserNameAndParam(String userName, Map<String, String> parameters) { public SsoUser selectByUserNameAndParam(String userName, Map<String, String> parameters) {
SsoUser ssoUser = new SsoUser() parameters.put("username", userName);
.setUserName(userName) R<SsoUser> result = remoteSsoUserService.selectByUserNameAndSsoUser(parameters);
.setIdentityProvider(parameters.get("identityProvider"));
ssoUser.setTenantId(parameters.get("tenantId"));
R<SsoUser> result = remoteSsoUserService.selectByUserNameAndSsoUser(ssoUser);
if (result.getCode() != R.SUCCESS) { if (result.getCode() != R.SUCCESS) {
throw new SecurityCheckedException(ObjectUtil.defaultIfBlank(result.getMsg(), "SecurityProviderTemplateImpl invoke failed!")); throw new SecurityCheckedException(ObjectUtil.defaultIfBlank(result.getMsg(), "SecurityProviderTemplateImpl invoke failed!"));
} }
@ -37,11 +34,8 @@ public class UserProviderTemplateImpl implements UserProviderTemplate<KiccUser>
@Override @Override
public SsoUser selectByPhoneAndParam(String phone, Map<String, String> parameters) { public SsoUser selectByPhoneAndParam(String phone, Map<String, String> parameters) {
SsoUser ssoUser = new SsoUser() parameters.put("phone", phone);
.setPhone(phone) R<SsoUser> result = remoteAppService.selectByPhoneAndSsoUser(parameters);
.setIdentityProvider(parameters.get("identityProvider"));
ssoUser.setTenantId(parameters.get("tenantId"));
R<SsoUser> result = remoteAppService.selectByPhoneAndSsoUser(ssoUser);
if (result.getCode() != R.SUCCESS) { if (result.getCode() != R.SUCCESS) {
throw new SecurityCheckedException(ObjectUtil.defaultIfBlank(result.getMsg(), "SecurityProviderTemplateImpl invoke failed!")); throw new SecurityCheckedException(ObjectUtil.defaultIfBlank(result.getMsg(), "SecurityProviderTemplateImpl invoke failed!"));
} }

4
kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/entity/CasUser.java

@ -109,6 +109,7 @@ public class CasUser extends User {
String email, String email,
String phone, String phone,
String sex, String sex,
String identityProvider,
String avatar, String avatar,
String loginIp, String loginIp,
LocalDateTime loginTime, LocalDateTime loginTime,
@ -126,6 +127,7 @@ public class CasUser extends User {
this.email = email; this.email = email;
this.phone = phone; this.phone = phone;
this.sex = sex; this.sex = sex;
this.identityProvider = identityProvider;
this.avatar = avatar; this.avatar = avatar;
this.loginIp = loginIp; this.loginIp = loginIp;
this.loginTime = loginTime; this.loginTime = loginTime;
@ -151,6 +153,7 @@ public class CasUser extends User {
String email, String email,
String phone, String phone,
String sex, String sex,
String identityProvider,
String avatar, String avatar,
String loginIp, String loginIp,
LocalDateTime loginTime, LocalDateTime loginTime,
@ -170,6 +173,7 @@ public class CasUser extends User {
this.email = email; this.email = email;
this.phone = phone; this.phone = phone;
this.sex = sex; this.sex = sex;
this.identityProvider = identityProvider;
this.avatar = avatar; this.avatar = avatar;
this.loginIp = loginIp; this.loginIp = loginIp;
this.loginTime = loginTime; this.loginTime = loginTime;

2
kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/grant/provider/CustomAppAuthenticationProvider.java

@ -82,7 +82,7 @@ public class CustomAppAuthenticationProvider extends AbstractUserDetailsAuthenti
// 手机号 // 手机号
String phone = authentication.getName(); String phone = authentication.getName();
UserDetails userDetails = optional.get().loadUserByParam(phone, (LinkedHashMap<String, String>)authentication.getCredentials()); UserDetails userDetails = optional.get().loadUserByParam(phone, (LinkedHashMap<String, String>)authentication.getDetails());
// userDetails 校验 // userDetails 校验
preAuthenticationChecks.check(userDetails); preAuthenticationChecks.check(userDetails);

2
kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/grant/provider/KiccDaoAuthenticationProvider.java

@ -102,7 +102,7 @@ public class KiccDaoAuthenticationProvider extends AbstractUserDetailsAuthentica
} }
try { try {
UserDetails loadedUser = optional.get().loadUserByParam(username, (LinkedHashMap<String, String>)authentication.getCredentials()); UserDetails loadedUser = optional.get().loadUserByParam(username, (LinkedHashMap<String, String>)authentication.getDetails());
if (loadedUser == null) { if (loadedUser == null) {
throw new InternalAuthenticationServiceException( throw new InternalAuthenticationServiceException(
"UserDetailsService returned null, which is an interface contract violation"); "UserDetailsService returned null, which is an interface contract violation");

1
kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/service/KiccUserDetailsService.java

@ -70,6 +70,7 @@ public interface KiccUserDetailsService extends Ordered {
user.getEmail(), user.getEmail(),
user.getPhone(), user.getPhone(),
user.getSex(), user.getSex(),
user.getIdentityProvider(),
user.getAvatar(), user.getAvatar(),
user.getLoginIp(), user.getLoginIp(),
user.getLoginTime(), user.getLoginTime(),

8
kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteAppService.java

@ -7,7 +7,9 @@ import com.cloud.kicc.common.core.constant.ServiceNameConstants;
import com.cloud.kicc.common.data.entity.SsoUser; import com.cloud.kicc.common.data.entity.SsoUser;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
/** /**
*<p> *<p>
@ -22,10 +24,10 @@ public interface RemoteAppService {
/** /**
* 通过手机号码查询用户 * 通过手机号码查询用户
* @param ssoUser sso用户 * @param param 参数
* @return R * @return R
*/ */
@GetMapping(value = AppConstants.APP_SYSTEM + "/app/selectByPhoneAndSsoUser", headers = SecurityConstants.HEADER_FROM_IN) @GetMapping(value = AppConstants.APP_SYSTEM + "/app/selectByPhoneAndSsoUser", headers = SecurityConstants.HEADER_FROM_IN)
R<SsoUser> selectByPhoneAndSsoUser(SsoUser ssoUser); R<SsoUser> selectByPhoneAndSsoUser(@RequestParam("param") Map<String, String> param);
} }

5
kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteDictService.java

@ -9,6 +9,7 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List; import java.util.List;
@ -28,7 +29,7 @@ public interface RemoteDictService {
* @param type 字典类型 * @param type 字典类型
* @return 返回字典项列表 * @return 返回字典项列表
*/ */
@GetMapping(value = AppConstants.APP_SYSTEM + "/dictData/getDictByType/{type}", headers = SecurityConstants.HEADER_FROM_IN) @GetMapping(value = AppConstants.APP_SYSTEM + "/dictData/dictType")
R<List<DictData>> getDictByType(@PathVariable("type") String type); R<List<DictData>> dictType(@RequestParam("type") String type, @RequestParam("tenantId") String tenantId);
} }

8
kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/feign/RemoteSsoUserService.java

@ -8,6 +8,10 @@ import com.cloud.kicc.common.data.entity.SsoUser;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
/** /**
*<p> *<p>
@ -22,10 +26,10 @@ public interface RemoteSsoUserService {
/** /**
* 通过用户名查询用户 * 通过用户名查询用户
* @param ssoUser sso用户 * @param param 参数
* @return R * @return R
*/ */
@GetMapping(value = AppConstants.APP_SYSTEM + "/ssoUser/selectByUserNameAndSsoUser", headers = SecurityConstants.HEADER_FROM_IN) @GetMapping(value = AppConstants.APP_SYSTEM + "/ssoUser/selectByUserNameAndSsoUser", headers = SecurityConstants.HEADER_FROM_IN)
R<SsoUser> selectByUserNameAndSsoUser(SsoUser ssoUser); R<SsoUser> selectByUserNameAndSsoUser(@RequestParam("param") Map<String, String> param);
} }

16
kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/AppController.java

@ -1,5 +1,6 @@
package com.cloud.kicc.system.controller; package com.cloud.kicc.system.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.cloud.kicc.common.core.api.R; import com.cloud.kicc.common.core.api.R;
import com.cloud.kicc.common.core.constant.AppConstants; import com.cloud.kicc.common.core.constant.AppConstants;
@ -9,12 +10,10 @@ import com.cloud.kicc.system.service.AppService;
import com.cloud.kicc.system.service.ISsoUserService; import com.cloud.kicc.system.service.ISsoUserService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
*<p> *<p>
@ -42,15 +41,16 @@ public class AppController {
/** /**
* 获取指定用户全部信息 * 获取指定用户全部信息
* @param ssoUser SSO用户 * @param param 参数
* @return 用户信息 * @return 用户信息
*/ */
@Inner @Inner
@GetMapping("/selectByPhoneAndSsoUser") @GetMapping("/selectByPhoneAndSsoUser")
public R<SsoUser> selectByPhoneAndSsoUser(SsoUser ssoUser) { public R<SsoUser> selectByPhoneAndSsoUser(@RequestParam Map<String, String> param) {
List<SsoUser> user = iSsoUserService.list(Wrappers.<SsoUser>lambdaQuery() List<SsoUser> user = iSsoUserService.list(Wrappers.<SsoUser>lambdaQuery()
.eq(SsoUser::getPhone, ssoUser.getPhone()) .eq(SsoUser::getPhone, param.get("phone"))
.eq(SsoUser::getIdentityProvider, ssoUser.getIdentityProvider())); .eq(SsoUser::getTenantId, param.get("tenantId"))
.eq(StrUtil.isNotBlank(param.get("identityProvider")) ,SsoUser::getIdentityProvider, param.get("identityProvider")));
if (user.isEmpty()) { if (user.isEmpty()) {
return R.error("该手机号不存在,请先注册!"); return R.error("该手机号不存在,请先注册!");
} }

15
kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/DictDataController.java

@ -57,16 +57,13 @@ public class DictDataController {
return R.ok(dictDataService.getById(id)); return R.ok(dictDataService.getById(id));
} }
@Inner @Inner(false)
@GetMapping("/getDictByType/{type}") @GetMapping("/dictType")
@Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type") @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type")
public R getDictByType(@PathVariable String type) { public R dictType(String type, String tenantId) {
return R.ok(dictDataService.list(Wrappers.<DictData>query().lambda().eq(DictData::getDictType, type))); return R.ok(dictDataService.list(Wrappers.<DictData>query().lambda()
} .eq(DictData::getDictType, type)
.eq(StrUtil.isNotBlank(tenantId), DictData::getTenantId, tenantId)));
@GetMapping("/dictType/{dictType}")
public R dictType(@PathVariable String dictType) {
return remoteDictService.getDictByType(dictType);
} }
@SysLog("字典数据新增") @SysLog("字典数据新增")

8
kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/SsoUserController.java

@ -21,6 +21,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map;
/** /**
*<p> *<p>
@ -90,10 +91,11 @@ public class SsoUserController {
@Inner @Inner
@GetMapping("/selectByUserNameAndSsoUser") @GetMapping("/selectByUserNameAndSsoUser")
public R selectByUserNameAndSsoUser(SsoUser ssoUser) { public R selectByUserNameAndSsoUser(@RequestParam Map<String, String> param) {
SsoUser user = iSsoUserService.getOne(Wrappers.<SsoUser>lambdaQuery() SsoUser user = iSsoUserService.getOne(Wrappers.<SsoUser>lambdaQuery()
.eq(SsoUser::getUserName, ssoUser.getUserName()) .eq(SsoUser::getUserName, param.get("username"))
.eq(SsoUser::getIdentityProvider, ssoUser.getIdentityProvider())); .eq(SsoUser::getTenantId, param.get("tenantId"))
.eq(StrUtil.isNotBlank(param.get("identityProvider")) ,SsoUser::getIdentityProvider, param.get("identityProvider")));
if (user == null) { if (user == null) {
return R.error("该用户不存在,请注册!"); return R.error("该用户不存在,请注册!");
} }

Loading…
Cancel
Save