如何扩展短信验证码登录

Blade 未结 1 879
137446a
137446a 剑圣 2022-10-19 16:05

一、该问题的重现步骤是什么?

1. 如何扩展短信验证码登录

2. 

3.


二、你期待的结果是什么?实际看到的又是什么?


三、你正在使用的是什么产品,什么版本?在什么操作系统上?


四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

1条回答
  • 2022-10-21 09:23

    单体版?还是微服务版?

    如果单体版比较简单, 如果是微服务版就是基于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);
       }
    
    }


    0 讨论(0)
提交回复