一、该问题的重现步骤是什么?
1. 如何扩展短信验证码登录
2.
3.
二、你期待的结果是什么?实际看到的又是什么?
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
四、请提供详细的错误堆栈信息,这很重要。
五、若有更多详细信息,请在下面提供。
单体版?还是微服务版?
如果单体版比较简单, 如果是微服务版就是基于oauth2改造一个了
下面是微服务版我改造的小程序登录的,还需要在client表里增加自己的数据即可,
你可以参考写发改成短信登录的
package org.springblade.auth.granter;
import org.springblade.auth.constant.AuthConstant;
import org.springblade.auth.service.BladeUserDetails;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.Func;
import org.springblade.system.user.dto.WeChatInfoDTO;
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.authority.AuthorityUtils;
import org.springframework.security.oauth2.common.exceptions.InvalidGrantException;
import org.springframework.security.oauth2.provider.*;
import org.springframework.security.oauth2.provider.token.AbstractTokenGranter;
import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 小程序TokenGranter
*
* @author gtf
*/
public class WechatMaTokenGranter extends AbstractTokenGranter {
private static final String GRANT_TYPE = "wechat_ma";
private final IUserClient userClient;
protected WechatMaTokenGranter(AuthorizationServerTokenServices tokenServices, ClientDetailsService clientDetailsService, OAuth2RequestFactory requestFactory, IUserClient userClient) {
super(tokenServices, clientDetailsService, requestFactory, GRANT_TYPE);
this.userClient = userClient;
}
@Override
protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) {
Map<String, String> parameters = new LinkedHashMap<>(tokenRequest.getRequestParameters());
// 登录时获取的 code
String code = parameters.get("code");
// 登录时获取的 phoneCode
String phoneCode = parameters.get("phoneCode");
// 小程序昵称
String nickName = parameters.get("nickName");
// 小程序头像
String portraitUrl = parameters.get("portraitUrl");
WeChatInfoDTO weChatInfoDTO = new WeChatInfoDTO();
weChatInfoDTO.setCode(code);
weChatInfoDTO.setPhoneCode(phoneCode);
weChatInfoDTO.setNickName(nickName);
weChatInfoDTO.setHeadImgUrl(portraitUrl);
// 远程调用,获取认证信息(注册)
R<UserInfo> result = userClient.wechatMaUserAuthInfo(weChatInfoDTO);
BladeUserDetails bladeUserDetails;
if (result.isSuccess()) {
User user = result.getData().getUser();
Kv detail = result.getData().getDetail();
if (user == null || user.getId() == null) {
throw new InvalidGrantException("social grant failure, user is null");
}
bladeUserDetails = new BladeUserDetails(user.getId(), BladeConstant.ADMIN_TENANT_ID, result.getData().getOauthId(), user.getName(),
user.getRealName(), user.getDeptId(), user.getPostId(), user.getRoleId(), user.getRealName(), user.getAvatar(),
user.getAccount(), AuthConstant.ENCRYPT + user.getPassword(), detail, true, true, true, true,
AuthorityUtils.commaSeparatedStringToAuthorityList(Func.join(result.getData().getRoles())));
} else {
throw new InvalidGrantException("wechat applet grant failure, feign client return error");
}
// 组装认证数据,关闭密码校验
AbstractAuthenticationToken userAuth = new UsernamePasswordAuthenticationToken(bladeUserDetails, null, bladeUserDetails.getAuthorities());
userAuth.setDetails(parameters);
OAuth2Request storedOAuth2Request = getRequestFactory().createOAuth2Request(client, tokenRequest);
// 返回 OAuth2Authentication
return new OAuth2Authentication(storedOAuth2Request, userAuth);
}
}
package org.springblade.auth.granter;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.social.props.SocialProperties;
import org.springblade.system.user.feign.IUserClient;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.provider.CompositeTokenGranter;
import org.springframework.security.oauth2.provider.TokenGranter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 自定义拓展TokenGranter
*
* @author Chill
*/
public class BladeTokenGranter {
/**
* 自定义tokenGranter
*/
public static TokenGranter getTokenGranter(final AuthenticationManager authenticationManager, final AuthorizationServerEndpointsConfigurer endpoints, BladeRedis bladeRedis, IUserClient userClient, SocialProperties socialProperties) {
// 默认tokenGranter集合
List<TokenGranter> granters = new ArrayList<>(Collections.singletonList(endpoints.getTokenGranter()));
// 增加验证码模式
granters.add(new CaptchaTokenGranter(authenticationManager, endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory(), bladeRedis));
// 小程序授权模式
granters.add(new WechatMaTokenGranter(endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory(), userClient));
// 增加第三方登陆模式
granters.add(new SocialTokenGranter(endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory(), userClient, socialProperties));
// 组合tokenGranter集合
return new CompositeTokenGranter(granters);
}
}
扫一扫访问 Blade技术社区 移动端