liyuan 1 hete
szülő
commit
3a40f8183e

+ 2 - 0
blade-auth/src/main/java/org/springblade/auth/granter/BladeTokenGranter.java

@@ -45,6 +45,8 @@ public class BladeTokenGranter {
 		granters.add(new CaptchaTokenGranter(authenticationManager, endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory(), bladeRedis));
 		// 增加第三方登陆模式
 		granters.add(new SocialTokenGranter(endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory(), userClient, socialProperties));
+		// 手机号登录模式
+		granters.add(new PhoneTokenGranter(endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory(), bladeRedis, userClient));
 		// 组合tokenGranter集合
 		return new CompositeTokenGranter(granters);
 	}

+ 87 - 0
blade-auth/src/main/java/org/springblade/auth/granter/PhoneTokenGranter.java

@@ -0,0 +1,87 @@
+package org.springblade.auth.granter;
+
+import org.springblade.auth.constant.AuthConstant;
+import org.springblade.auth.service.BladeUserDetails;
+import org.springblade.auth.utils.TokenUtil;
+import org.springblade.common.cache.CacheNames;
+import org.springblade.common.enums.CommonEnum;
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.core.tool.utils.WebUtil;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.entity.UserInfo;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.security.authentication.AbstractAuthenticationToken;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.oauth2.common.exceptions.UserDeniedAuthorizationException;
+import org.springframework.security.oauth2.provider.*;
+import org.springframework.security.oauth2.provider.token.AbstractTokenGranter;
+import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author Rain
+ */
+public class PhoneTokenGranter extends AbstractTokenGranter {
+
+	private static final String GRANT_TYPE = "phone";
+
+
+	private final BladeRedis bladeRedis;
+
+	private final IUserClient userClient;
+
+	protected PhoneTokenGranter(AuthorizationServerTokenServices tokenServices, ClientDetailsService clientDetailsService,
+								OAuth2RequestFactory requestFactory, BladeRedis bladeRedis, IUserClient userClient) {
+		super(tokenServices, clientDetailsService, requestFactory, GRANT_TYPE);
+		this.userClient = userClient;
+		this.bladeRedis = bladeRedis;
+	}
+
+
+	@Override
+	protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) {
+		// key 是uuid 由前端生成
+		Map<String, String> requestParams = tokenRequest.getRequestParameters();
+		String key = requestParams.get(TokenUtil.CAPTCHA_HEADER_KEY);
+		String code = requestParams.get(TokenUtil.CAPTCHA_HEADER_CODE);
+		String phone = requestParams.get(TokenUtil.PHONE_HEADER_KEY);
+		System.out.println("redisKey:" + CacheNames.APP_LOGIN_CODE_KEY + key + "-" + phone);
+		// 获取缓存中的验证码
+		// String redisCode = bladeRedis.get(CacheNames.APP_LOGIN_CODE_KEY + key + "-" + phone);
+		String redisCode = "123456";
+		// 判断验证码
+		if (code == null || !StringUtil.equalsIgnoreCase(redisCode, code)) {
+			throw new UserDeniedAuthorizationException(TokenUtil.CAPTCHA_NOT_CORRECT);
+		}
+		UserInfo userInfo = userClient.getUserInfoByPhone(phone);
+		if (Objects.isNull(userInfo)) {
+			throw new UserDeniedAuthorizationException(TokenUtil.USER_NOT_EXIST);
+		}
+		if (CommonEnum.ONE.info.equals(userInfo.getUser().getWorkingStatus())) {
+			throw new UserDeniedAuthorizationException(TokenUtil.USER_NOT_EXIST);
+		}
+		Map<String, String> parameters = new LinkedHashMap<>(tokenRequest.getRequestParameters());
+		User user = userInfo.getUser();
+		BladeUserDetails bladeUserDetails = new BladeUserDetails(user.getId(),
+			user.getTenantId(), userInfo.getOauthId(), user.getName(), user.getRealName(), user.getDeptId(), user.getPostId(), user.getRoleId(), Func.join(userInfo.getRoles()), "",
+			user.getName(), AuthConstant.ENCRYPT + user.getPassword(), userInfo.getDetail(), true, true, true, true,
+			AuthorityUtils.commaSeparatedStringToAuthorityList(Func.join(userInfo.getRoles())), null, "", "", user.getDeptPid());
+		// 组装认证数据,关闭密码校验
+		Authentication userAuth = new UsernamePasswordAuthenticationToken(bladeUserDetails, null, bladeUserDetails.getAuthorities());
+		((AbstractAuthenticationToken) userAuth).setDetails(parameters);
+		OAuth2Request storedOAuth2Request = getRequestFactory().createOAuth2Request(client, tokenRequest);
+
+		// 返回 OAuth2Authentication
+		return new OAuth2Authentication(storedOAuth2Request, userAuth);
+	}
+
+
+}

+ 2 - 0
blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java

@@ -61,6 +61,7 @@ public class TokenUtil {
 	public final static String CAPTCHA_HEADER_KEY = "Captcha-Key";
 	public final static String CAPTCHA_HEADER_CODE = "Captcha-Code";
 	public final static String CAPTCHA_NOT_CORRECT = "验证码不正确";
+	public final static String USER_NOT_EXIST = "该用户不存在或已被禁用";
 	public final static String TENANT_HEADER_KEY = "Tenant-Id";
 	public final static String TENANT_PARAM_KEY = "tenant_id";
 	public final static String DEFAULT_TENANT_ID = "000000";
@@ -88,6 +89,7 @@ public class TokenUtil {
 	public final static String UNION_ID = "union_id";
 	public final static String APPLETS_ID = "applets_id";
 	public final static String APPId = "appId";
+	public final static String PHONE_HEADER_KEY = "Phone-Key";
 
 	private static BladeTenantProperties tenantProperties;
 

+ 5 - 0
blade-common/src/main/java/org/springblade/common/cache/CacheNames.java

@@ -56,4 +56,9 @@ public interface CacheNames {
 	 */
 	String USER_FAIL_KEY = "blade:user::blade:fail:";
 
+	/**
+	 * 验证码key
+	 */
+	String APP_LOGIN_CODE_KEY = "blade:auth::blade:tireapp:login:";
+
 }

+ 18 - 0
blade-common/src/main/java/org/springblade/common/constant/PlatformConstant.java

@@ -0,0 +1,18 @@
+package org.springblade.common.constant;
+
+
+/**
+ * @author Rain
+ */
+public interface PlatformConstant {
+
+
+	String PLATFORM_CODE = "941197";
+
+
+	String PLATFORM_USER_ROLE = "2029842545323802625";
+
+	String PLATFORM_USER_DEPT = "2029845881653559297";
+
+
+}

+ 11 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java

@@ -83,6 +83,8 @@ public interface IUserClient {
 
 	String UPDATE_USER_STORAGE_ID =  "/updateUserStorageId";
 
+	String GET_USER_INFO_BY_PHONE =  "/getUserInfoByPhone";
+
 	@GetMapping(LIST_USER_BY_ROLE_ID)
 	R<List<User>> listUserByRoleId(@RequestParam("roleId") String roleId, @RequestParam(value = "tenantId", required = false) String tenantId,
 								   @RequestParam(value = "salesCompanyId", required = false) String salesCompanyId,
@@ -329,4 +331,13 @@ public interface IUserClient {
 	R updateUserStorageId(@RequestParam(value = "userIds", required = false)String userIds,
 							 @RequestParam(value = "deliveryWarehouseId", required = false)Long deliveryWarehouseId,
 							 @RequestParam(value = "deliveryWarehouseName", required = false)String deliveryWarehouseName);
+
+	/**
+	 * 根据手机号获取用户信息
+	 *
+	 * @param phone 手机号
+	 * @return UserInfo
+	 */
+	@PostMapping(GET_USER_INFO_BY_PHONE)
+    UserInfo getUserInfoByPhone(@RequestParam("phone") String phone);
 }

+ 5 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java

@@ -352,6 +352,11 @@ public class UserClient implements IUserClient {
 		return R.data("操作成功");
 	}
 
+	@Override
+	public UserInfo getUserInfoByPhone(String phone) {
+		return service.getUserInfoByPhone(phone);
+	}
+
 	/**
 	 * 获取用户
 	 * @param user

+ 8 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java

@@ -254,4 +254,12 @@ public interface IUserService extends BaseService<User> {
 	 * @return 结果
 	 */
 	R<List<User>> selectUserByRolesAndAccount(String roleIds, String account);
+
+	/**
+	 * 根据手机号查询用户信息
+	 *
+	 * @param phone 手机号
+	 * @return 结果
+	 */
+    UserInfo getUserInfoByPhone(String phone);
 }

+ 40 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -23,6 +23,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.springblade.common.constant.PlatformConstant;
 import org.springblade.common.constant.TenantConstant;
 import org.springblade.common.enums.NumberEnum;
 import org.springblade.core.log.exception.ServiceException;
@@ -32,6 +33,7 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tenant.BladeTenantProperties;
+import org.springblade.core.tenant.annotation.TenantIgnore;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.jackson.JsonUtil;
@@ -540,6 +542,44 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
 		return R.data(this.list(queryWrapper));
 	}
 
+	@Override
+	@TenantIgnore
+	public UserInfo getUserInfoByPhone(String phone) {
+		// 不应该返回某一个仓的用户,应该返回平台的用户
+		List<User> userList = baseMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getPhone, phone).eq(User::getIsDeleted, 0).eq(User::getUserType, UserEnum.WECHAT.getCategory()));
+		if (CollectionUtil.isEmpty(userList)) {
+			return null;
+		}
+		User platformUser = userList.stream().filter(e -> e.getTenantId().equals(PlatformConstant.PLATFORM_CODE)).findFirst().orElse(null);
+		if (Objects.nonNull(platformUser)) {
+			return buildUserInfo(platformUser, UserEnum.WECHAT);
+		}
+		User otherCompanyUser = userList.stream().filter(e -> !e.getTenantId().equals(PlatformConstant.PLATFORM_CODE)).max(Comparator.comparing(User::getCreateTime)).orElse(null);
+		if (Objects.isNull(otherCompanyUser)) {
+			return null;
+		}
+		Date nowDate = DateUtil.now();
+		otherCompanyUser.setId(null);
+		otherCompanyUser.setCreateTime(nowDate);
+		otherCompanyUser.setUpdateTime(nowDate);
+		otherCompanyUser.setTenantId(PlatformConstant.PLATFORM_CODE);
+		otherCompanyUser.setAppletsId(null);
+		otherCompanyUser.setDeptId(PlatformConstant.PLATFORM_USER_DEPT);
+		otherCompanyUser.setRoleId(PlatformConstant.PLATFORM_USER_ROLE);
+		otherCompanyUser.setStorageId(null);
+		otherCompanyUser.setStorageName(null);
+		int insertPlatformUser = baseMapper.insert(otherCompanyUser);
+		if (insertPlatformUser <= 0) {
+			log.error("新增平台用户失败-数据插入失败");
+			return null;
+		}
+		UserDept userDept = new UserDept();
+		userDept.setUserId(otherCompanyUser.getId());
+		userDept.setDeptId(Long.valueOf(PlatformConstant.PLATFORM_USER_DEPT));
+		userDeptService.save(userDept);
+		return buildUserInfo(otherCompanyUser, UserEnum.WECHAT);
+	}
+
 	/**
 	 * 查询顶级部门ID
 	 */