位置: IT常识 - 正文

若依前后端分离版:增加新的登录接口,用于小程序或者APP获取token,并使用若依的验证方法(若依前后端分离需要准备啥)

编辑:rootadmin
若依前后端分离版:增加新的登录接口,用于小程序或者APP获取token,并使用若依的验证方法 LoginController类

具体代码/** * app 登录 */ @AnonymousAccess @PostMapping("login") public AjaxResult login(@RequestBody LoginBody loginBody) { AjaxResult ajax = AjaxResult.success(); // 生成令牌 String token = loginService.login(loginBody.getUsername(), loginBody.getPassword()); ajax.put(Constants.TOKEN, token); return ajax; }

推荐整理分享若依前后端分离版:增加新的登录接口,用于小程序或者APP获取token,并使用若依的验证方法(若依前后端分离需要准备啥),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:若依前后端分离 net版,若依前后端分离 net版,若依前后端分离框架图,若依前后端分离二次开发,若依前后端分离部署,若依前后端分离部署,若依前后端分离环境部署,若依前后端分离部署,内容如对您有帮助,希望把文章链接给更多的朋友!

登录校验 ——AppLoginService类

 具体代码

@Resourceprivate AppAuthenticationProvider authenticationManager;  /** * 登录验证 * * @param username 用户名 * @param password 密码 * @return 结果 */ public String login(String username, String password) { // 用户验证 Authentication authentication; try { // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername authentication = authenticationManager .authenticate(new UsernamePasswordAuthenticationToken(username, password)); } catch (Exception e) { if (e instanceof BadCredentialsException) { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); throw new UserPasswordNotMatchException(); } else { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); throw new ServiceException(e.getMessage()); } } AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); recordLoginInfo(loginUser.getUserId()); // 生成token return tokenService.createToken(loginUser); }AppAuthenticationProvider 类

 具体代码

@Componentpublic class AppAuthenticationProvider implements AuthenticationProvider { private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); @Autowired private AppUserDetailsServiceImpl userDetailsService; @SneakyThrows @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String userName = authentication.getName();// 这个获取表单输入中返回的用户名; Object password = authentication.getCredentials();//这个获取表单输入中返回的密码; // 这里构建来判断用户是否存在和密码是否正确 UserDetails userInfo = userDetailsService.loadUserByUsername(userName); // 这里调用我们的自己写的获取用户的方法; if(!SecurityUtils.matchesPassword(password.toString(),userInfo.getPassword())){ log.info("用户不存在/密码错误,{}", userName); throw new ServiceException("用户不存在/密码错误"); } Collection<? extends GrantedAuthority> authorities = userInfo.getAuthorities(); // 构建返回的用户登录成功的token return new UsernamePasswordAuthenticationToken(userInfo, userInfo.getPassword(), authorities); } @Override public boolean supports(Class<?> authentication) {// return authentication.equals(UsernamePasswordAuthenticationToken.class); // 这里直接改成 return true;表示是支持这个执行 return true; }}AppUserDetailsServiceImpl类

 具体代码

@Servicepublic class AppUserDetailsServiceImpl implements UserDetailsService { private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); @Autowired private IProductMemberService memberService;//自己写的接口 @Autowired private IProductMemberCourtService memberCourtService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { ProductMember member = memberService.selectUserByUserName(username);//验证登录用户 if (StringUtils.isNull(member)) { log.info("登录用户:{} 不存在.", username); throw new ServiceException("登录用户:" + username + " 不存在"); } else if (UserStatus.DELETED.getCode().equals(member.getDelFlag())) { log.info("登录用户:{} 已被删除.", username); throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); } else if (UserStatus.DISABLE.getCode().equals(member.getStatus())) { log.info("登录用户:{} 已被停用.", username); throw new ServiceException("对不起,您的账号:" + username + " 已停用"); } return createLoginUser(member); } public UserDetails createLoginUser(ProductMember member) { return new LoginUser(member.getMemberId(), memberCourtService.selectCourtIdByMemberId(member.getMemberId()), member); }}

此时运行时,会有冲突!!!

需要在 xxx-framework/src/main/java/....../SecurityConfig中条件

@Qualifier("userDetailsServiceImpl")

如图:

 此时启动项目不会报冲突的错

千万千万要添加!!!

下图中的LongUser类要添加东西

 要在public String getPassword(){}中添加自己写的登录实体类的getPassword()

若依前后端分离版:增加新的登录接口,用于小程序或者APP获取token,并使用若依的验证方法(若依前后端分离需要准备啥)

以上内容已经可以解决app和小程序新的登录接口方案和后台管理的登陆获取token不冲突

以下内容可作为参考:

登录认证JWTtoken验证机制

后端部分 /login 接口 userName password code 验证码 前端获取上面三个要素后调用接口,整体改接口做了下面几件事情

1、验证用户身份(账号密码+验证码) 2、生成token 3、保存用户登录态到spring security中

安全配置:定义了基本的配置信息framework.config.SecurityConfigUserDetailsServiceImpl 用户验证处理类登录接口的服务类framework.web.service.SysLoginServiceJWT拦截器,拦截令牌并校验信息framework.security.filter.JwtAuthenticationTokenFilter

详细过程

1、SysLoginService 中调用UserDetailsServiceImpl校验用户的密码是否匹配以及用户账户状态,校验通过后返回UserDetails实例,该实例包含了用户的基本信息和菜单权限信息 2、调用tokenService.createToken(loginUser)生成token令牌生成的详细过程

生成uuid随机数,这个随机数用来做rediskey存储token 生成一个token(无时效) 拦截到的token如果距离失效在10分钟以内(可配置)就自动刷新有效期

前面提到了token本身无时效,有效期是通过redis控制的,因为jwt本身未提供刷新有效期的方法(可能是我不知道)。

以上用户调用了login接口并且获得了token

jwt令牌校验  

/** * token过滤器 验证token有效性 *  * @author sj */@Componentpublic class JwtAuthenticationTokenFilter extends OncePerRequestFilter{    @Autowired    private TokenService tokenService;    @Override    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)            throws ServletException, IOException    {        LoginUser loginUser = tokenService.getLoginUser(request);        if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))        {            tokenService.verifyToken(loginUser);            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));            SecurityContextHolder.getContext().setAuthentication(authenticationToken);        }        chain.doFilter(request, response);    }}

代码比较短,所以就直接贴出来,这段代码拦截了所有请求并且完成了令牌的校验和刷新,具体过程如下

1、tokenService.getLoginUser(request); 从request中获取token并校验,如果校验通过就返回LoginUser对象 2、校验LoginUser的token,如果再刷限期内就直接刷新 3、将LoginUser封装到SecurityContextHolder中作为全局的用户登录状态

注:第3条有两个好处

1、后续拦截器发现SecurityContextHolder中保存了用户时,就直接通过校验 2、通过SecurityContextHolder可以快速获取当前请求的登录信息。 以上基本上已经说名了JWT校验的基本过程,忽略了很多细节

getInfo 获取用户信息 1、用户的基本信息 2、用户所有的Permissions(菜单树) 3、用户所有的RopePersmission(roleKeys)

getRouters 获取前端页面路由信息 这个接口完全为前端准备,后面会专门讲述前端的权限控制

 

本文链接地址:https://www.jiuchutong.com/zhishi/273391.html 转载请保留说明!

上一篇:Linux下配置Docker容器间网络连接的教程(linux使用docker)

下一篇:上网速度慢该如何处理?(上网慢怎么解决)

  • 拥有大量微博粉丝的作用(微博粉丝多有钱吗)

    拥有大量微博粉丝的作用(微博粉丝多有钱吗)

  • 红米k40支持wifi6么(红米k40支持wifi几)

    红米k40支持wifi6么(红米k40支持wifi几)

  • 荣耀9x的马达是线性马达吗(荣耀x10max马达)

    荣耀9x的马达是线性马达吗(荣耀x10max马达)

  • 联想lj2605d硒鼓灯亮(联想lj2605d硒鼓型号)

    联想lj2605d硒鼓灯亮(联想lj2605d硒鼓型号)

  • 双十一退回的红包还能用吗(2020双十一退货红包退回吗?)

    双十一退回的红包还能用吗(2020双十一退货红包退回吗?)

  • 美团话费抵用券用不了(美团话费抵用券怎么领)

    美团话费抵用券用不了(美团话费抵用券怎么领)

  • 华为p30为什么声音突然小了(华为p30为什么声音变小了)

    华为p30为什么声音突然小了(华为p30为什么声音变小了)

  • 微信信息没有提示怎么回事(微信发了消息20分钟想撤回)

    微信信息没有提示怎么回事(微信发了消息20分钟想撤回)

  • qq设置纯黑色气泡(qq设置纯黑色气泡在哪里)

    qq设置纯黑色气泡(qq设置纯黑色气泡在哪里)

  • oppo手机开关机键失灵怎么办(oppo手机开关机键失灵是怎么回事)

    oppo手机开关机键失灵怎么办(oppo手机开关机键失灵是怎么回事)

  • 苹果下载不了app怎么回事(苹果下载不了app一直要验证)

    苹果下载不了app怎么回事(苹果下载不了app一直要验证)

  • surface pro1796是几代(surfacepro1796是几代)

    surface pro1796是几代(surfacepro1796是几代)

  • 京东账号注销了还能恢复吗(京东账号注销了实名认证就解绑了吗)

    京东账号注销了还能恢复吗(京东账号注销了实名认证就解绑了吗)

  • 移动电源额定容量什么意思(移动电源额定容量计算)

    移动电源额定容量什么意思(移动电源额定容量计算)

  • 云扫码是什么(云扫码官网)

    云扫码是什么(云扫码官网)

  • 笔记本主板坏了有必要修吗(笔记本主板坏了数据还能恢复吗)

    笔记本主板坏了有必要修吗(笔记本主板坏了数据还能恢复吗)

  • 怎么剪去视频多余部分(剪辑视频怎么把多余剪掉)

    怎么剪去视频多余部分(剪辑视频怎么把多余剪掉)

  • 淘宝菜鸟驿站怎么加盟(淘宝菜鸟驿站怎么看身份码)

    淘宝菜鸟驿站怎么加盟(淘宝菜鸟驿站怎么看身份码)

  • 透视型封面怎么设置(透视型封面office中改成什么了)

    透视型封面怎么设置(透视型封面office中改成什么了)

  • ps怎么做1寸相片(ps怎么设置1寸照片尺寸)

    ps怎么做1寸相片(ps怎么设置1寸照片尺寸)

  • iPhone Xs Max的分辨率(iphone xs max的分辨率是多少)

    iPhone Xs Max的分辨率(iphone xs max的分辨率是多少)

  • 怎样cad合并快捷键(cad2019合并快捷键)

    怎样cad合并快捷键(cad2019合并快捷键)

  • api接口异常(api错误)

    api接口异常(api错误)

  • 现代信号处理——时频分析与时频分布(小波变换)(现代信号处理张贤达)

    现代信号处理——时频分析与时频分布(小波变换)(现代信号处理张贤达)

  • python列表删除项目的方法(python删除列表的方法)

    python列表删除项目的方法(python删除列表的方法)

  • 融资租赁税率是什么意思
  • 固定资产入股交什么税
  • 发票备注栏必须备注的有哪些
  • 支付招聘费收到专票怎么记账
  • 酒店怎么合理规划管理
  • 没收入金税盘减免项如何申报处理及会计分录
  • 营改增后进项税额分摊
  • 年报中纳税总额怎么填
  • 营改增转让土地税收政策
  • 增值税认证未认证是什么意思
  • 小规模收专用发票后成为一般纳税人吗
  • 企业拨缴工会经费申报后税务机关需要审核吗
  • 关于个人所得税纳税人的说法正确的有
  • 增值税更正申报表需要逐月更正吗
  • 子公司与总公司的关系说明书
  • 鸿蒙3.0平板适配名单
  • 建筑企业自持商是指
  • 档案保管期限是写汉字吗?
  • 电脑上加速网页的加速器
  • php大小写转换函数怎么写
  • 协调费用应该怎么表述才合理
  • PHP:Memcached::replaceByKey()的用法_Memcached类
  • 冈山平原
  • 房屋租赁经营要交哪些税
  • 加拿大巨石
  • 固定资产清查盘点报告模板
  • 怎么把html转成图片
  • vue中的路由参数如何获取
  • 残差网络中的残差指的是什么
  • centos7编译安装内核
  • phpstorm wsl
  • 员工不小心重复报销了
  • 小规模纳税人季度不超30万怎么做账
  • 织梦怎么用
  • 清卡后还可以勾选发票吗
  • 长期股权投资采用成本法核算的,应按被投资单位
  • sql server基本
  • 对外支付代扣代缴税费
  • 小规模减免的增值税
  • 事业单位其他应付款核销分录
  • 商品损耗率一般是多少
  • 人力资源劳务费计入什么科目
  • 收到支付宝认证怎么做账
  • 永续债举例
  • 应付职工薪酬要设二级科目吗
  • 会计信息不采集可以考初级吗
  • 收入成本的确认条件
  • MySQL在Linux系统中隐藏命令行中的密码的方法
  • 数据库中自动增长
  • linux系统vim编辑readonly option
  • win7怎么彻底删除文件
  • solaris版本查询
  • 为什么我的win7系统会变成xp系统
  • macpro教程
  • mac win10 wifi
  • windows账户升级为管理员
  • Win10 Mobile Build 14342上手体验视频
  • Win7系统打开D盘文件后怎么没有后退箭头
  • [置顶]电影名字《收件人不详》
  • ubuntu 编译ffmpeg
  • cocos2dx lua在sublime下的插件安装及查看定义
  • python标准库os中的方法
  • nodejs事件循环和js事件循环
  • linux进程切换 宋宝华
  • angular2双向数据绑定原理
  • shell脚本编程100例
  • 磁盘监视器在哪
  • nodejs-websocket
  • Python编程中的逻辑与控制
  • javascript的弹窗
  • jquery常见问题
  • python中删除语句
  • js new实现
  • ios反编译源代码
  • 税务部门督查内审部门监督检查的内容
  • 已申报的纳税申报表怎么修改
  • 减免性质代码怎么会自动选择
  • 国家税务总局朝阳税务局
  • 太原市小店区电影院营业时间
  • 广州地税局官网办事点
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设