服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - springsecurity 企业微信登入的实现示例

springsecurity 企业微信登入的实现示例

2022-11-13 12:01川流不息attitude Java教程

本文主要介绍了springsecurity 企业微信登入的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

背景

后台系统需要接入 企业微信登入,满足企业员工快速登入系统

流程图

springsecurity 企业微信登入的实现示例

简单代码说明

自定义一套 springsecurity 认证逻辑

主要就是 根据code 获取绑定用户信息 然后返回登入 token ,和qq ,微信 等第 3方登入 一个套路

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// 自定义 WeChatAuthenticationProvider
public class WeChatAuthenticationProvider  implements AuthenticationProvider {
 
    private UserDetailsService userDetailsService;
 
    public WeChatAuthenticationProvider(UserDetailsService userDetailsService){
        this.userDetailsService = userDetailsService;
    }
 
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        WeChatAuthenticationToken authenticationToken = (WeChatAuthenticationToken) authentication;
 
        String userId = (String) authenticationToken.getPrincipal();
 
        UserDetails userDetails = userDetailsService.loadUserByUsername(userId);
 
        // 此时鉴权成功后,应当重新 new 一个拥有鉴权的 authenticationResult 返回
        BrowserAuthenticationToken authenticationResult = new BrowserAuthenticationToken(userDetails, userDetails.getAuthorities());
 
        authenticationResult.setDetails(authenticationToken.getDetails());
 
        return authenticationResult;
    }
 
 
    @Override
    public boolean supports(Class<?> authentication) {
        // 判断 authentication 是不是 SmsCodeAuthenticationToken 的子类或子接口
        return WeChatAuthenticationToken.class.isAssignableFrom(authentication);
    }
 
    public UserDetailsService getUserDetailsService() {
        return userDetailsService;
    }
 
    public void setUserDetailsService(UserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }
}
 
// 重写 UserDetailsService
    @Override
    public UserDetails loadUserByUsername(String code) throws UsernameNotFoundException {
        String weChatUserId = weChatService.getWeChatUserId(code);
        LambdaQueryWrapper<SysUserWechat> lambda = new QueryWrapper<SysUserWechat>().lambda();
        lambda.eq(SysUserWechat::getDeleted, DataStatusEnum.NORMAL.getCode());
        lambda.eq(SysUserWechat::getWechatId,weChatUserId);
        List<SysUserWechat> sysUserWechats = sysUserWechatService.list(lambda);
 
        if(CollectionUtils.isEmpty(sysUserWechats)){
            throw new ServiceException(GOOGLE_AUTHENTICATOR_601001.getMsg(),GOOGLE_AUTHENTICATOR_601001.getCode());
        }
        SysUserWechat sysUserWechat = sysUserWechats.get(0);
        Long sysUserId = sysUserWechat.getSysUserId();
        SysUser sysUser = userService.selectUserById(sysUserId);
        if (StringUtils.isNull(sysUser)) {
            throw new ServiceException(GOOGLE_AUTHENTICATOR_601001.getMsg(),GOOGLE_AUTHENTICATOR_501001.getCode());
        }
        if (UserStatus.DELETED.getCode().equals(sysUser.getDelFlag())) {
            throw new ServiceException(GOOGLE_AUTHENTICATOR_601001.getMsg(),GOOGLE_AUTHENTICATOR_501001.getCode());
        }
        if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) {
            throw new ServiceException(GOOGLE_AUTHENTICATOR_601001.getMsg(),GOOGLE_AUTHENTICATOR_501001.getCode());
        }
 
        return createLoginUser(sysUser);
    }

到此这篇关于springsecurity 企业微信登入的实现示例的文章就介绍到这了,更多相关springsecurity 企业微信登入内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.jianshu.com/p/95b2bceeb530

延伸 · 阅读

精彩推荐
  • Java教程Java中用Socket实现HTTP文件上传实例

    Java中用Socket实现HTTP文件上传实例

    本篇文章主要介绍了Java中用Socket实现HTTP文件上传实例,详细的介绍了通过读取Socket的输入流来实现一个文件上传的功能,有兴趣的同学可以一起了解一下...

    木叶之荣2702020-09-09
  • Java教程Java ArrayList扩容问题实例详解

    Java ArrayList扩容问题实例详解

    这篇文章主要介绍了Java ArrayList扩容问题实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下...

    Mirhunana6452021-03-30
  • Java教程Java绘图技术基础(实例讲解)

    Java绘图技术基础(实例讲解)

    下面小编就为大家带来一篇Java绘图技术基础(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Java之家4662020-12-11
  • Java教程原来Java中有两个ArrayList

    原来Java中有两个ArrayList

    原来Java中有两个ArrayList,本文就带着大家一起探究Java中的ArrayList,感兴趣的小伙伴们可以参考一下 ...

    云聪4392020-03-21
  • Java教程搭建MyBatis开发环境及基本的CURD介绍

    搭建MyBatis开发环境及基本的CURD介绍

    这篇文章主要介绍了搭建MyBatis开发环境及基本的CURD,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    山丘i3452020-08-06
  • Java教程深入了解Java Synchronized锁升级过程

    深入了解Java Synchronized锁升级过程

    java中的锁是针对对象而言的,它锁住的是一个对象,并且具有可重入的性质,下面这篇文章主要给大家介绍了关于Java Synchronized锁升级过程的相关资料,需要的朋...

    SH的全栈笔记5232022-09-07
  • Java教程java中的JSONP使用实例详解

    java中的JSONP使用实例详解

    json和JSONP这二者在开发中还是很常见的,本文重点给大家介绍下java中的jsonp使用实例详解,需要的朋友参考下...

    踏月凌风4712020-09-18
  • Java教程Java使用Math.random()结合蒙特卡洛方法计算pi值示例

    Java使用Math.random()结合蒙特卡洛方法计算pi值示例

    这篇文章主要介绍了Java使用Math.random()结合蒙特卡洛方法计算pi值的方法,简单说明了结合具体实例蒙特卡洛方法的原理,并结合具体实例形式分析了java使用蒙...

    软货11032021-01-04