springboot+jwt+微信小程序授权登录获取token的方法实例

 更新时间:2022年03月09日 15:04:11   作者:泉城老铁  
本文主要介绍了springboot+jwt+微信小程序授权登录获取token的方法实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

我们有时候在开发中,遇到这样的问题,就是我们需要小程序授权登录我们自己的后台,通过小程序的信息换取我们自己后台的token,实现账号密码、小程序授权登录的多种登录方式。

配置

在 SecurityConfig文件中配置

XcxAuthenticationProvider

public class XcxAuthenticationProvider implements AuthenticationProvider {
    private UserDetailsService userDetailsService;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        XcxAuthenticationToken authenticationToken = (XcxAuthenticationToken) authentication;

        String openId = (String) authenticationToken.getPrincipal();


        XcxUserService service= SpringContextUtil.getContext().getBean(XcxUserService.class);

        UserDetails userDetails = service.loadUserByOpenId(openId);

        // 此时鉴权成功后,应当重新 new 一个拥有鉴权的 authenticationResult 返回
        XcxAuthenticationToken authenticationResult = new XcxAuthenticationToken(userDetails, userDetails.getAuthorities());

        authenticationResult.setDetails(authenticationToken.getDetails());

        return authenticationResult;
    }


    @Override
    public boolean supports(Class<?> authentication) {
        // 判断 authentication 是不是 SmsCodeAuthenticationToken 的子类或子接口
        return XcxAuthenticationToken.class.isAssignableFrom(authentication);
    }

    public UserDetailsService getUserDetailsService() {
        return userDetailsService;
    }

    public void setUserDetailsService(UserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }
}

XcxAuthenticationToken

public class XcxAuthenticationToken extends AbstractAuthenticationToken { private static final long serialVersionUID = 420L;
    private final Object principal;

    /**
     * 没登录之前,principal我们使用手机号
     * @param openid
     */
    public XcxAuthenticationToken(String openid) {
        super((Collection)null);
        this.principal = openid;
        this.setAuthenticated(false);
    }

    /**
     * 登录认证之后,principal我们使用用户信息
     * @param principal
     * @param authorities
     */
    public XcxAuthenticationToken(Object principal, Collection<? extends GrantedAuthority> authorities) {
        super(authorities);
        this.principal = principal;
        super.setAuthenticated(true);
    }
    public Object getCredentials() {
        return null;
    }
    public Object getPrincipal() {
        return this.principal;
    }
    public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
        if (isAuthenticated) {
            throw new IllegalArgumentException("Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");
        } else {
            super.setAuthenticated(false);
        }
    }
    public void eraseCredentials() {
        super.eraseCredentials();
    }
}

小程序授权登录

@RestController
@RequestMapping("/xcx")
@AllArgsConstructor
@Api(value = "认证模块", tags = "认证模块")
public class XcxAuthController {

    private JwtService jwtService;
    private JwtUserDetail jwtUserDetail;
    private XcxUserService userService;
    private AuthenticationManager authenticationManager;

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ApiOperation(value = "登录", notes = "登录")
    public Result login(@RequestBody Map<String, Object> map) {
        HashMap<String, Object> hashMap = new HashMap<>();
        String code = String.valueOf(map.get("code"));
        try {
            WxMaService wxMaService = WxMaConfiguration.getWxMaService();
            WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);

            XcxUser user = userService.getOne(Wrappers.<XcxUser>lambdaQuery()
                        .eq(XcxUser::getOpenId, session.getOpenid()), false);
                if (ObjectUtil.isNull(user)) {
                    //过滤掉表情
                    user = XcxUser.builder()
                            .openId(session.getOpenid())
//                        .nickname(wxMpUser.getNickName())
//                        .avatar(wxMpUser.getAvatarUrl())
                            .build();
                userService.save(user);
            } else {
                userService.updateById(user);
            }
            UserDetails userDetails = jwtUserDetail.loadUserByOpenId(session.getOpenid());
            authenticationManager.authenticate(new XcxAuthenticationToken(session.getOpenid()));
            Map<String, Object> parse = JSON.parseObject(JSON.toJSONString(userDetails), Map.class);
            String token = jwtService.createToken(parse);
            hashMap.put("token", token);
            hashMap.put("user", userDetails);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Result.success(hashMap);
    }


}

这里就基本完成了小程序的授权登录获取token的功能了,希望可以帮助到大家

到此这篇关于springboot+jwt+微信小程序授权登录获取token的方法实例的文章就介绍到这了,更多相关springboot 小程序授权登录获取token内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现马踏棋盘游戏

    java实现马踏棋盘游戏

    这篇文章主要为大家详细介绍了java实现马踏棋盘游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java生成N个不重复的随机数的三种方法总结

    Java生成N个不重复的随机数的三种方法总结

    这篇文章主要为大家详细介绍了三种Java生成N个不重复的随机数的方法,文中的示例代码讲解详细,具有一定的参考价值,有需要的可以了解下
    2023-10-10
  • Spring Batch 如何自定义ItemReader

    Spring Batch 如何自定义ItemReader

    这篇文章主要介绍了Spring Batch 如何自定义ItemReader的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java事件机制要素及实例详解

    Java事件机制要素及实例详解

    这篇文章主要介绍了Java事件机制要素及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 基于UDP协议实现聊天系统

    基于UDP协议实现聊天系统

    这篇文章主要为大家详细介绍了基于UDP协议实现聊天系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Java使用itextpdf实现生成PDF并添加图片,水印和文字

    Java使用itextpdf实现生成PDF并添加图片,水印和文字

    这篇文章主要为大家详细介绍了Java在使用itextpdf实现生成PDF时如何实现添加图片,水印和文字等效果,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Spring AOP实现用户登录统一验证功能

    Spring AOP实现用户登录统一验证功能

    这篇文章主要为大家详细介绍了Spring AOP如何实现用户登录统一验证功能,文中的示例代码讲解详细,对我们学习具有一定的借鉴价值,需要的可以参考一下
    2023-01-01
  • Java中URL的处理方法详解

    Java中URL的处理方法详解

    URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址,表示为互联网上的资源,本文主要为大家介绍了Java是如何处理URL的,感兴趣的可以了解一下
    2023-05-05
  • IntelliJ IDEA连接MySQL数据库详细图解

    IntelliJ IDEA连接MySQL数据库详细图解

    今天小编就为大家分享一篇关于intellij idea连接mysql数据库详细图解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • AQS同步组件Semaphore信号量案例剖析

    AQS同步组件Semaphore信号量案例剖析

    这篇文章主要为大家介绍了AQS同步组件Semaphore信号量案例剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论