|
@@ -0,0 +1,83 @@
|
|
|
+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.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.enums.UserEnum;
|
|
|
+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 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) {
|
|
|
+ HttpServletRequest request = WebUtil.getRequest();
|
|
|
+ // 获取前端传输的验证码
|
|
|
+ String key = request.getHeader(TokenUtil.CAPTCHA_HEADER_KEY);
|
|
|
+ String code = request.getHeader(TokenUtil.CAPTCHA_HEADER_CODE);
|
|
|
+ String phone = request.getHeader(TokenUtil.PHONE_HEADER_KEY);
|
|
|
+ // 获取缓存中的验证码
|
|
|
+ String redisCode = bladeRedis.get(CacheNames.CAPTCHA_KEY + key);
|
|
|
+ // String redisCode = "wnxax";
|
|
|
+ // 判断验证码
|
|
|
+ if (code == null || !StringUtil.equalsIgnoreCase(redisCode, code)) {
|
|
|
+ throw new UserDeniedAuthorizationException(TokenUtil.CAPTCHA_NOT_CORRECT);
|
|
|
+ }
|
|
|
+ UserInfo userInfo = userClient.getUserInfoByPhone(phone, UserEnum.APP.getCategory());
|
|
|
+ if (Objects.isNull(userInfo)) {
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|