一、该问题的重现步骤是什么?
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) { Mapparameters = 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 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集合 Listgranters = 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技术社区 移动端