springsecurity 企业微信登入的实现示例
更新时间:2022年04月15日 10:52:38 作者:川流不息attitude
本文主要介绍了springsecurity 企业微信登入的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
背景
后台系统需要接入 企业微信登入,满足企业员工快速登入系统
流程图

简单代码说明
自定义一套 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);
}到此这篇关于springsecurity 企业微信登入的实现示例的文章就介绍到这了,更多相关springsecurity 企业微信登入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Boot2中如何优雅地个性化定制Jackson实现示例
这篇文章主要为大家介绍了Spring Boot2中如何优雅地个性化定制Jackson实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-05-05
JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql
这篇文章主要给大家介绍了关于JDBC中如何使用Java8的日期LocalDate和LocalDateTime的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2017-09-09
Java的函数式接口@FunctionalInterface的使用说明
这篇文章主要介绍了Java的函数式接口@FunctionalInterface的使用说明,我们常用的一些接口Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface注解,需要的朋友可以参考下2024-01-01


最新评论