最新要闻
- word文档怎么做思维导图?word文档怎么做小抄?
- 宏碁4750g怎么进入bios?宏碁4750G需要哪些驱动?
- 电视机顶盒怎么破解?电视机顶盒哪个牌子好用?
- 诺基亚710上市价格是多少?诺基亚710手机现在能用吗?
- 天然气热值是多少大卡?天然气热值换算表
- 焦点报道:直播间疯狂刷礼物可能是在洗钱:网络水军用千部手机给主播打赏 最多刷10亿元
- 国产操作系统deepin推送20.8版本:wine应用开启速度获得提升
- 联想PC小新桌面助手上线:实用性堪比手机控制中心
- 无叶无根无枝条的花你见过没?曾消失30年:开败后就变黑
- 世界今亮点!《原神》《幻塔》都败了!《MARVEL SNAP》摘得TGA 2022年度最佳手游
- 【全球播资讯】RTX 3050加持 联想轻薄旗舰本小新Pro 16史低价:5799元
- 【聚看点】特斯拉左转失控 车主称刹车和方向盘突然变硬:官方售后回应尴尬
- 观热点:海外经销商顶不住:RTX 4080英国又降价 轻松降近900元还会继续
- 焦点播报:首批车主反馈良好!恒驰汽车回应停工停产传闻:恒驰5按计划交付
- 即时焦点:谷歌Chrome浏览器新模式上线:最多可减少30%内存占用
- 每日消息!2岁就给爹打工 马斯克给儿子发了一张工牌
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
快播:第三方登录组件-JustAuth
(相关资料图)
1、新增依赖
me.zhyd.oauth JustAuth 1.16.5
2、前端示例
<script>export default { name: "SocialSignin", methods: { // 请求后台获取跳转路径 thirdLoginClick(source) { this.$store.dispatch("user/thirdLogin", {source: source}).then(() => { }).catch(() => { }) } }}</script>
// 第三方登录 thirdLogin({commit}, userInfo) { const {source} = userInfo return new Promise((resolve, reject) => { thirdLogin({source: source.trim()}).then(response => { console.log("第三方登录返回", response) if (response.data.code === "200") { window.location.href = response.data.url } else { Message.warning(response.data.msg); } resolve() }).catch(error => { reject(error) }) }) }
export function thirdLogin(data) { return request({ url: "/login/render", method: "post", params: {source: data.source} })}
3、后端示例
获取跳转路径
import com.mxy.common.core.utils.ServiceResult;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import lombok.extern.slf4j.Slf4j;import me.zhyd.oauth.request.AuthRequest;import me.zhyd.oauth.utils.AuthStateUtils;import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;import java.util.*;/** * 第三方登录认证 */@RestController@RequestMapping("/api/login")@Api(value = "第三方登录相关接口", tags = {"第三方登录相关接口"})@Slf4jpublic class AuthRestApi { @Resource private AuthUtil authUtil; @ApiOperation(value = "系统认证", notes = "系统认证") @RequestMapping("/render") public String renderAuth(String source) { log.info("进入第三方认证:" + source); Mapmap = new HashMap<>(); AuthRequest authRequest = authUtil.getAuthRequest(source); if (authRequest == null) { map.put("code", "201"); map.put("msg", "系统未开启该登录方式"); return ServiceResult.success(map); } String token = AuthStateUtils.createState(); String authorizeUrl = authRequest.authorize(token); log.info("获取返回url:" + authorizeUrl); map.put("code", "200"); map.put("url", authorizeUrl); return ServiceResult.success(map); }}
拦截登录回调接口(ThirdPartyAuthenticationFilter)
import me.zhyd.oauth.model.AuthCallback;import org.springframework.security.authentication.AuthenticationServiceException;import org.springframework.security.core.Authentication;import org.springframework.security.core.AuthenticationException;import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;import org.springframework.security.web.util.matcher.AntPathRequestMatcher;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 第三方登录-拦截器 * 拼接入参 */public class ThirdPartyAuthenticationFilter extends AbstractAuthenticationProcessingFilter { public static String EXTEND_LOGIN_URL = "/api/login/callback/**"; private boolean getOnly = true; /** * 表示这个 Filter 拦截 /api/login/callback/** 接口 */ private static final AntPathRequestMatcher DEFAULT_ANT_PATH_REQUEST_MATCHER = new AntPathRequestMatcher(EXTEND_LOGIN_URL, "GET"); public ThirdPartyAuthenticationFilter() { super(DEFAULT_ANT_PATH_REQUEST_MATCHER); } @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { if (this.getOnly && !"GET".equals(request.getMethod())) { throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); } else { ThirdPartyAuthenticationToken authRequest = new ThirdPartyAuthenticationToken(getSourceType(request), getCallback(request)); this.setDetails(request, authRequest); return this.getAuthenticationManager().authenticate(authRequest); } } protected void setDetails(HttpServletRequest request, ThirdPartyAuthenticationToken authRequest) { authRequest.setDetails(this.authenticationDetailsSource.buildDetails(request)); } /** * 组装请求 */ private AuthCallback getCallback(HttpServletRequest request) { return AuthCallback.builder() .code(request.getParameter("code")) .auth_code(request.getParameter("auth_code")) .authorization_code(request.getParameter("authorization_code")) .oauth_token(request.getParameter("oauth_token")) .state(request.getParameter("state")) .oauth_verifier(request.getParameter("oauth_verifier")) .build(); } /** * 判断-登录系统类型 */ private String getSourceType(HttpServletRequest request) { String uri = request.getRequestURI(); int common = EXTEND_LOGIN_URL.length() - 2; int start = uri.indexOf(EXTEND_LOGIN_URL.substring(0, common)); return uri.substring(start + common); }}
封装用户信息(ThirdPartyAuthenticationToken)
import me.zhyd.oauth.model.AuthCallback;import org.springframework.security.authentication.AbstractAuthenticationToken;import org.springframework.security.core.GrantedAuthority;import java.util.Collection;/** * 模仿 UsernamePasswordAuthenticationToken * 封装用户信息 */public class ThirdPartyAuthenticationToken extends AbstractAuthenticationToken { /** * 认证返回 */ private AuthCallback callback; /** * 登录类型 */ private String source; /** * 用户实体 */ private Object principal; /** * 用户id */ private Object credentials; public ThirdPartyAuthenticationToken(String source, AuthCallback callback) { super(null); this.source = source; this.callback = callback; setAuthenticated(false); } public ThirdPartyAuthenticationToken(Object principal, Object credentials, Collection extends GrantedAuthority> authorities) { super(authorities); this.principal = principal; this.credentials = credentials; super.setAuthenticated(true); } @Override public Object getPrincipal() { return principal; } @Override public Object getCredentials() { return credentials; } public Object getCallback() { return callback; } public Object getSource() { return source; }}
第三方统一登录认证逻辑(ThirdPartyAuthenticationProvider)
package com.mxy.security.justauth;import com.alibaba.fastjson.JSONObject;import com.mxy.common.core.constant.Constants;import com.mxy.common.core.entity.SelfUserEntity;import com.mxy.common.core.entity.SysRole;import com.mxy.common.core.entity.SysUser;import com.mxy.common.core.entity.SysUserRole;import com.mxy.common.core.utils.IPUtils;import com.mxy.common.core.utils.RedisUtil;import com.mxy.common.core.utils.ServletUtils;import com.mxy.common.log.enums.OperType;import com.mxy.security.security.service.SelfUserDetailsService;import com.mxy.system.service.SysUserService;import com.mxy.system.utils.LogUtil;import lombok.extern.slf4j.Slf4j;import me.zhyd.oauth.model.AuthCallback;import me.zhyd.oauth.model.AuthResponse;import me.zhyd.oauth.model.AuthUser;import me.zhyd.oauth.request.AuthRequest;import org.springframework.beans.BeanUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.authentication.AuthenticationProvider;import org.springframework.security.authentication.BadCredentialsException;import org.springframework.security.authentication.LockedException;import org.springframework.security.core.Authentication;import org.springframework.security.core.AuthenticationException;import org.springframework.security.core.GrantedAuthority;import org.springframework.security.core.authority.SimpleGrantedAuthority;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.stereotype.Component;import javax.annotation.Resource;import java.util.*;/** * 第三方统一登录认证逻辑 */@Slf4j@Componentpublic class ThirdPartyAuthenticationProvider implements AuthenticationProvider { @Autowired private SelfUserDetailsService selfUserDetailsService; @Autowired private SysUserService sysUserService; @Autowired private RedisUtil redisUtil; @Resource private AuthUtil authUtil; @Resource private BCryptPasswordEncoder bCryptPasswordEncoder; private Random random = new Random(); /** * 第三方统一登录认证逻辑 */ @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { ThirdPartyAuthenticationToken token = (ThirdPartyAuthenticationToken) authentication; String source = (String) token.getSource(); AuthCallback callback = (AuthCallback) token.getCallback(); log.info("------------进入" + source + "认证逻辑, callback params:" + JSONObject.toJSONString(callback)); AuthRequest authRequest = authUtil.getAuthRequest(source); AuthResponse response = authRequest.login(callback); if (response.getCode() == 5000) { // 认证失败 throw new BadCredentialsException(source + "认证失败"); } AuthUser authUser = (AuthUser) response.getData(); log.info("------------认证用户:{}", authUser); // 根据 uuid 查询用户信息 SelfUserEntity userInfo = selfUserDetailsService.getUserInfoByUuid(authUser.getUuid()); if (userInfo == null) { // 自动注册 userInfo = doRegister(authUser); } if (Constants.USER_STATE_TWO.equals(userInfo.getStatus())) { LogUtil.saveLog("该账号已冻结[" + userInfo.getRelName() + "]", 99); throw new LockedException("该账号已冻结"); } // 角色集合 Setauthorities = new HashSet<>(); // 查询用户角色 List sysRoleList = sysUserService.selectSysRoleByUserId(userInfo.getUserId()); for (SysRole sysRole : sysRoleList) { authorities.add(new SimpleGrantedAuthority(sysRole.getRoleKey())); } userInfo.setAuthorities(authorities); ThirdPartyAuthenticationToken authenticationResult = new ThirdPartyAuthenticationToken(userInfo, userInfo.getUserId(), userInfo.getAuthorities()); authenticationResult.setDetails(token.getDetails()); return authenticationResult; } /** * 账号注册 **/ public SelfUserEntity doRegister(AuthUser authUser) { SelfUserEntity selfUser = new SelfUserEntity(); SysUser sysUser = new SysUser(); sysUser.setNickName(authUser.getNickname()); sysUser.setUsername(authUser.getSource() + (random.nextInt(89999999) + 10000000)); String password = String.valueOf(random.nextInt(899999) + 100000); sysUser.setPassword(bCryptPasswordEncoder.encode(password)); sysUser.setAvatar(authUser.getAvatar()); sysUser.setRegistrationType(authUser.getSource()); sysUser.setUuid(authUser.getUuid()); sysUser.setLoginCount(0); sysUser.setIpSource(IPUtils.getClientIp(Objects.requireNonNull(ServletUtils.getRequest()))); // 2-男 sysUser.setSex("2".equals(authUser.getRawUserInfo().getString("gender_type")) ? "0" : "1"); sysUser.setCreateUser("system"); sysUser.setRemark(authUser.getSource() + "首次注册默认密码为:" + password); sysUser.setLoginDate(new Date()); sysUser.setUserType("2"); sysUser.insert(); // 新增用户角色关系 SysUserRole sysUserRole = new SysUserRole(); sysUserRole.setUserId(sysUser.getUserId()); // 游客 sysUserRole.setRoleId("2"); sysUserRole.insert(); BeanUtils.copyProperties(sysUser, selfUser); selfUser.setRelName(sysUser.getNickName()); LogUtil.saveNoLoginLog("账号注册(" + authUser.getSource() + ")", JSONObject.toJSONString(sysUser), OperType.REGISTRATION.ordinal()); return selfUser; } /** * 判断是上面 authenticate 方法的 authentication 参数,是哪种类型 * Authentication 是个接口,实现类有很多,目前我们最熟悉的就是 ThirdPartyAuthenticationToken、UsernamePasswordAuthenticationToken * 很明显,我们只支持 ThirdPartyAuthenticationToken,因为它封装的是TOKEN OPENID * * @param authentication * @return */ @Override public boolean supports(Class> authentication) { return (ThirdPartyAuthenticationToken.class.isAssignableFrom(authentication)); }}
关键词:
-
环球今亮点!把ipa文件上传到App Store教程步骤
iOSAPP上架AppStore其中一个步骤就是要把ipa文件上传到AppStore!下面进行步骤介绍!利用Appuploade...
来源: -
每日热讯!易基因:简化甲基化测序(RRBS)在植物生态表观基因组学中的机遇和局限|深度综述
易基因:简化甲基化测序(RRBS)在植物生态表观基因组学中的机遇和局限|深度综述大家好,这里是专注表观...
来源: 快播:第三方登录组件-JustAuth
【环球报资讯】BI智慧仓储,带你体验数字化仓储物流管理
环球今亮点!把ipa文件上传到App Store教程步骤
每日热讯!易基因:简化甲基化测序(RRBS)在植物生态表观基因组学中的机遇和局限|深度综述
当前聚焦:记.net framework php接口 返回数据格式问题 请求接口远程服务器返回错误: (500) 内部服务器错误
ChatGPT 大白话 SmartIDE
Zabbix与乐维监控对比分析(三)——对象管理篇
全球报道:专访|开源之夏最佳质量奖 Apache RocketMQ Committer 黄章衡
世界热消息:.net6制作让同事不能上网的arp欺骗工具
每日热门:如何利用 A/B 实验提升产品用户留存? 看字节实战案例给你答案!
chatGPT辣么火,你却不会注册
每日速讯:2022最新上传ipa到appstore的步骤说明
怎么在电脑上查看iPhone定位?iphone定位不准怎么校正?
怎么验证windows是不是正版?验证windows正版的方法有哪些?
光大银行信用卡额度一般是多少?光大银行信用卡怎么查询进度?
银行卡号泄露有危险吗?银行卡号泄露挂失有用吗?
空调怎么省电?空调省电的正确用法有哪些?
word文档怎么做思维导图?word文档怎么做小抄?
宏碁4750g怎么进入bios?宏碁4750G需要哪些驱动?
电视机顶盒怎么破解?电视机顶盒哪个牌子好用?
诺基亚710上市价格是多少?诺基亚710手机现在能用吗?
天然气热值是多少大卡?天然气热值换算表
环球热议:行为管理(锐捷业务软件篇)
焦点报道:直播间疯狂刷礼物可能是在洗钱:网络水军用千部手机给主播打赏 最多刷10亿元
国产操作系统deepin推送20.8版本:wine应用开启速度获得提升
联想PC小新桌面助手上线:实用性堪比手机控制中心
无叶无根无枝条的花你见过没?曾消失30年:开败后就变黑
世界今亮点!《原神》《幻塔》都败了!《MARVEL SNAP》摘得TGA 2022年度最佳手游
【全球速看料】BI智慧仓储行业应用方案,让你的仓储物流不再复杂
【全球播资讯】RTX 3050加持 联想轻薄旗舰本小新Pro 16史低价:5799元
【聚看点】特斯拉左转失控 车主称刹车和方向盘突然变硬:官方售后回应尴尬
观热点:海外经销商顶不住:RTX 4080英国又降价 轻松降近900元还会继续
焦点播报:首批车主反馈良好!恒驰汽车回应停工停产传闻:恒驰5按计划交付
即时焦点:谷歌Chrome浏览器新模式上线:最多可减少30%内存占用
每日消息!2岁就给爹打工 马斯克给儿子发了一张工牌
世界球精选!《仙剑奇侠传七》更新2.0版本:体积直接减半 内存、显存占用更低
振奋!全球首架C919今日交付中国东方航空:大家啥时候能坐上国产大飞机?
真实感渲染:变换(二维与三维)
老年人到底要不要打新冠疫苗?怎么打?一文说清
世界实时:对称加密
信息:CSS相对定位3大应用场景5个实战应用案例详解
今日最新!FreeSWITCH学习笔记:系统架构
Redis主从复制,哨兵模式和集群模式
漏洞预警:宝塔面板疑似出现高危漏洞
看不上油改电 要不来看看电改油?3000公里不用充电
友商旗舰陆续发布 产品经理:小米13毫无压力
焦点热文:支付宝可以绑境外银行卡了:4步搞定 直接扫码
世界快消息!SpringBoot中统一日志管理
MAUI新生3.5-深入理解XAML:行为Behavior
动态焦点:人工智能ChatGPT被玩坏了
世界百事通!卖不动车后 特斯拉上海工厂最新现状:闲下来了
天天速看:激光投影成了香饽饽!第三季度市场出货量17.5万台
苹果感受下!宋紫薇道出环保真谛:都用一套充电器才是真环保
直播两大奇观上演:火星冲日巧遇火星伴月 下次这么亮得等2033年
年薪90万 却起诉公司太无聊:每天上班只能摸鱼
全球今热点:JIT 即时编译 (史上最全)
喜大普奔!欧盟要求统一使用Type-C时间确定:苹果iPhone必须要换USB-C
被批沉闷 影迷吐槽矫情!《阿凡达2》首映后好评率超95% 首选必看IMAX 3D版
热点!卢伟冰:电竞手机注定要消亡
既是口罩又能降噪听歌!戴森发布空气净化耳机Dyson Zone:中国网友狂吐槽
天天快报!镜头可伸缩!传音发布Tecno Phantom X2系列新机
SK海力士研发全球最快内存:超越DDR5-4800 80%!
环球短讯!小米13多次被偷跑 法务“好心”提醒:可判3-10年
12代i7售价过万!传音推出Tecno MegaBook S1笔记本
看点:印度推首款黄金ATM机 插卡取金币的机子你用过吗?
【全球时快讯】俩孩童遇电梯迫降从16楼坠至1楼:万幸平安无事
排面!小刀电动车成芜湖官方指定用车:渔政、城管都在用
Model-Agnostic Meta-Learning (MAML) 理解
当前焦点!用HTML CSS 实现简洁美观的时间线(历史年表)
世界快资讯丨Win7/8.1再见了!前两大浏览器Chrome和Edge最新版均已放弃支持
环球关注:纯洁的曲线之美:索泰发布RTX 40 AMP月白显卡
环球即时:绿源、松果牌部分电动自行车召回 原因均是后尾灯反光
记录--微信小程序获取用户信息(附代码、流程图)
天天快看:13 Javac将源码编译为字节码的过程
每日精选:数据安全新战场,EasyMR为企业筑起“安全防线”
环球通讯!江淮大众退出历史!大众安徽首台预量产车下线:MEB纯电平台、对标Model Y
ThinkPad X1 Carbon 30周年纪念版开卖:18999元!只有300台
环球报道:可换京东100元充值卡:微软奖励积分计划国区上线
环球热消息:没钱买车了?乘联会公布11月零售销量:14年来首次“旺季”环比下滑
世界热点评!7399元大杀器?AMD RX 7900 XT显卡性能跑分首曝:不及期望
热讯:AI绘画,画你心中所想!【飞链云版图】,圆你心中所梦!
小米13 Pro旷野绿至尊套装公布:一整套全是绿的!
【天天时快讯】利润减少18亿!宗庆后承诺娃哈哈3万员工工资不降年终奖照发:网友直呼良心
焦点资讯:启动性能提升50%!Win11安卓子系统升级Android 13
每日看点!宁德时代拿下本田汽车超级大单 2030年前供货123GWh电池
全球速读:ChatGPT国产平替出现了:APP商店就能下载 还可给AI加人设
速看:【智能PDU】智慧网络远程电源开关管理系统
全球短讯!Python中12个常用模块的使用教程
你知道“智慧城市”是什么吗?
前沿资讯!NOIP2022第二题喵了个喵题解与SPJ
视点!libmongoc库和libbson库的使用
iQOO 11性能猛挤牙膏:130万跑分、内存秒变24GB
一块屏幕同时两种刷新率!iQOO 11支持LTPO4.0+分区高刷
最新快讯!领124元神券!蒙牛Nopa燃型低脂纤维奶昔牛乳大促:10瓶35元
《阿凡达2》首映后被批了 影评人:剧情没第一部好看!全片冗长、台词沉闷
Redis这个内存回收,确实有点牛逼!!!
Azure Devops 流水线任务插件开发教程 (1/3) —— Quick Start
滚动:一行代码 网页变灰
百度爱番番基于图技术、流式计算的实时CDP建设实践
世界微速讯:PDF转Word完全指南:3大方法满足各种场景!