springsecurity 企业微信登入的实现示例
作者:川流不息attitude 发布时间:2023-06-16 16:39:35
标签:spring,security,企业微信登入
背景
后台系统需要接入 企业微信登入,满足企业员工快速登入系统
流程图
简单代码说明
自定义一套 springsecurity 认证逻辑
主要就是 根据code 获取绑定用户信息 然后返回登入 token ,和qq ,微信 等第 3方登入 一个套路
// 自定义 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);
}
来源:https://www.jianshu.com/p/95b2bceeb530
0
投稿
猜你喜欢
- 您已经看到很多包含视频内容的应用程序,比如带有视频教程的食谱应用程序、电影应用程序和体育相关的应用程序。您是否想知道如何将视频内容添加到您的
- IntelliJ IDEA 2021最新激活码超详细教程,成功激活到2099年。每天专业人士测试,保证可以使用才分享给大家的,放心大胆使用哈
- 目录简介官方示例错误示例解决方法一:Scaffold的子组件通过Builder构建解决方法二:使用GlobalKey存储ScaffoldSt
- 相比于直线检测,直线拟合的最大特点是将所有数据只拟合出一条直线void fitLine( InputArray points, Output
- 光流的概念是由一个叫Gibson的哥们在1950年提出来的。它描述是空间运动物体在观察成像平面上的像素运动的瞬时速度,利用图像序列中像素在时
- 因为mybatis好使,所以几乎需要操作数据库的时候,我都会使用mybatis,而且在一个正式的项目中,同时存在BS和CS的程序,都使用的M
- 一、前言在Spring中,事务有两种实现方式:编程式事务管理: 编程式事务管理使用TransactionTemplate可实现更细
- 目录Navigator 的 push 和 pop方法代码实现最终效果Navigator 的 push 和 pop方法Navigator 导航
- 目录效果展示剪裁 WidgetClipRRect(圆角矩形剪裁)其他属性其他形状剪裁ClipOval(椭圆剪裁)其他属性ClipRect(矩
- 背景在接口请求过程中,传递json对象,springboot转换为实体VO对象后,所有属性都为null。post请求:后台接收请求:当时就懵
- 一、写在前面 数据结构中的队列应该是比较熟悉的
- mport java.text.DecimalFormat; DecimalFormat &nb
- 目录为什么要使用路由Flutter路由介绍页面结构与逻辑实现关键代码页面路由跳转为什么要使用路由在之前我们的代码中,页面跳转使用的代码如下所
- 引语:工作中有时候需要在普通的对象中去调用spring管理的对象,但是在普通的java对象直接使用@Autowired或者@Resource
- 在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较
- forward_list 概述forward_list 是 C++ 11 新增的容器,它的实现为单链表。forward_list 是支持从容
- 背景最近好几个项目在运行过程中客户都提出文件上传大小的限制能否设置的大一些,用户经常需要上传好几个G的资料文件,如图纸,视频等,并且需要在上
- [LeetCode] 205. Isomorphic Strings 同构字符串Given two strings s
- 近日于LeetCode看题遇1114 按序打印,获悉一解法使用了Semaphore,顺势研究,记心得于此。此解视Semaphore为锁,以保
- 目标效果: 点击动画按钮之后每张牌各自旋转 散开到屏幕上半部分的任意位置之后回到初始位置 比较像LOL男刀的技能动画 : )1: 创建卡牌对