219. 单页应用 会话管理(session、cookie、jwt)

原文链接:https://github.com/ly525/blog...

关键字:http-only, cookie,sessionid, vue-router, react-router, 安全localStorage, jwt

需求描述

  1. 内部管理平台,需要用户登录之后才能访问。现在将 该平台地址(www.xxx.com/home) 直接发给新来的运营同学
  2. 前端需要检测该用户是否已登录,如果未登录,则将其 redirect 到登录页面
  3. 因为该页面为单页应用,路由跳转不涉及后端的 302 跳转,使用前端路由跳转

实现思路

实现代码

// 以 vue-router 为例
// 登录中间验证,页面需要登录而没有登录的情况直接跳转登录
router.beforeEach((to, from, next) => {const hasToken = document.cookie.includes('sessionid');// 如果采用 jwt,则同样 hasToken = localStorage.jwtconst pathNeedAuth = to.matched.some(record => record.meta.requiresAuth);// 用户本地没有后端返回的 cookie 数据 && 前往的页面需要权限// if (pathNeedAuth && !hasToken ) {next({path: '/login',query: { redirect: to.fullPath },});} else if (hasToken && to.name === 'login') {// 已登录 && 前往登录页面, 则不被允许,会重定向到首页next({path: '/',});} else {next();}
});
  1. 应该在进入任何页面之前,判断:

    1. 该页面是否需要权限才能访问:登录、注册页面不需要权限
    2. 用户是否已经登录:本地 cookie (或者 localStorage)包含 session 相关信息

       Cookie: csrftoken=YaHb...; sessionid=v40ld3x....
  2. 如果 A页面需要权限本地 cookie中包含了 sessionid 字段,则允许访问A页面,否则跳转到登录页面

    1. 备注:sessionid 该字段由用户在登录之后,由后端框架通过 response.setCookie 写入前端 ,因此该字段需要和后端同学确认
    2. 需要后端同学在 response header 中配置cookie中该字段的 http-only属性,允许前端读取 cookie。否则前端通过 document.cookie 读取到的 cookie 将不包含 sessionid 字段
    3. 这个时候,可能会存在 js 读取cookie 导致不安全的情况,后端同学可以把 cookie 中的某个字段设置为 允许读取,其他 cookie 设置不允许读取,这样即使被第三方不安全脚本获取,也无法产生负面影响。
  3. 如果用户已登录 && 在浏览器中输入了登录页地址,则将其重定向到首页

更多说明

  1. 这样做,前端就不必再向后端发起 API 做权限鉴定了(后端返回401,前端跳转到 401),减少不必要的API 请求,特别是如果在API响应时间过长的情况下,体验不太友好。
  2. 用户修改 cookie,伪造 sessionid

    1. 这样的话,前端就无能为力了,前端鉴权此时认为该用户合法。此时访问首页,将会调用获取数据的API。
    2. 浏览器会将 用户伪造的 sessionid 带给后端,这时候就需要后端对 sessionid 进行较验了。比如校验前端带来的 sessionid 与数据库中的 sessionid 是否一致
    3. 用户伪造的数据 sessionid 和 后端数据库中 sessionid 的概率 非常非常低,可以忽略不计,因为 sessionid 的位数一般在 32 位以上,因为里面包含了字母和数字,也就由 32 ^ 36 种可能
    4. 结论:伪造没有意义,即使用户可以看到页面的样子,但是看不到数据
  3. 采用 localStorage 而不是 sessionStorage 的原因(SessionStorage 失效场景)

    原因:sessionStorage 无法跨 Tab 共享
    1. 用户在新打开一个 Tab,输入已经登录之后的某个页面
    2. 通过target="_blank" 来打开新页面的时候,会导致会话失效
    3. 在当前页面执行 Duplicate (复制 Tab),sessionStorage 失效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(原+译)使用numpy.savez保存字典后读取的问题

转载请注明出处: http://www.cnblogs.com/darkknightzh/p/7608928.html 参考网址; https://stackoverflow.com/questions/22315595/saving-dictionary-of-header-information-using-numpy-savez python中,使用pickle保存变量时,如果变量过大&…

NLog 通过http保存日志

简介NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。 NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的(contextual information&#xff09…

嵌套映射

1. 多对一嵌套查询映射使用案例 package com.zixue.dao;import com.zixue.annotation.MyBatisRepository; import com.zixue.entity.Emp;/*** 员工表的DAO组件* */ MyBatisRepository public interface EmpDao {void save(Emp emp);Emp findById(int id);Emp findById2(int id)…

gopro dataset_如何将GoPro安装到DSLR相机

gopro datasetIf you have a DSLR camera with a hot shoe, it’s easy to attach various flashes and other accessories right to your camera. But with a couple of cheap attachments on hand, you can mount your GoPro to your DSLR camera as well. 如果您的DSLR相机带…

音频 m4a 转 wav

背景最近做智能家居,需要用到一些应答词 需要自己录制。但是在mac下面通过 QuickTime 录制的是 m4a格式。但是应答词需要 wav格式。所以就需要转化了解决方法# sox 不行, ffmpeg 很麻烦,用 avconv 很简单。安装 如果没有就安装 # apt-get ins…

jQuery已经过时了,还需要学吗?

说起jQuery,很多刚参加工作的程序员都没用过,甚至没听过。曾几何时jQuery可是秒杀一切Js库,大有一统江山的情况,可是在顶峰的时候,瞬间被Vue、React、Angela三大框架斩于马下。从百度指数,我们也看出在2015…

Bootstrap01

Bootstrap01内容概要 一.使用Bootstrap的步骤 1.下载Bootstrap类库,包含三个部分,fonts,css,Bootstrap 2.导入项目中,在头部引入JQ,css和Bootstrap 注意:JQ要引入在Bootstrap前面! 3.使用css样式时,全部使用class属性 二.全局CSS概要 1.仅支持H5文档格式 2.移动设备优先,需要在…

ios raise_如何在iOS 10中关闭“ Raise to Wake”

ios raiseRaise to Wake is a new Lock screen feature available in iOS 10. It allows you to wake your phone’s screen simply by picking up your phone. This feature is on by default, but if you’d rather not use it, it’s simple to turn off. “唤醒”是iOS 10中…

资源调度器调研

2019独角兽企业重金招聘Python工程师标准>>> 场景描述: 异步触发和Crontab触发 YARN(Yet Another Resource Negotiator)Hadoop 资源管理器 主要构成: RM(ResourceManager)是一个全局的资源管理器,负责整个系统的资源管理和分配。…

WPF-19 IValueConverter接口

我们先来看看微软官方给出的定语:提供将自定义逻辑应用于绑定的方法,我们来看一下该接口的定义,Convert提供了将数据源到UI的格式化,ConvertBack表示反向namespace System.Windows.Data {//// Summary:// Provides a way to a…

JVM学习记录-类加载的过程

类的整个生命周期的7个阶段是:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)。 类加载的全过程主要包括:加载、验证、准备、解析、初始化这5个…

使用 Azure CLI 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager 部署模型

以下步骤演示如何使用 Azure 命令行接口 (CLI) 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型。 本文中的操作需要 Azure CLI。 Note 此处描述的所有操作都是幂等的。 如果你遇到功能不受支持或配置错误以外的问题,建议你…

c++的进制转换函数

https://blog.csdn.net/u010003835/article/details/47665847https://blog.csdn.net/vir_lee/article/details/80645066strtol函数:用于由十进制转化到2~36的其他进制。函数原型为:long int strtol(const char *nptr,char **endptr,int base); 还应该注意…

黑苹果不能imessage_如何修复iMessage在iOS 10中不显示消息效果

黑苹果不能imessageiMessage got a huge update in iOS 10, adding things like third-party app integration, rich links, and a number of fun graphical effects for messages. If you’re seeing messages that say something like “(sent with Invisible Ink)” instead…

MyBatisPlus怎么忽略映射字段

TableField(exist false):表示该属性不为数据库表字段,但又是必须使用的。 TableField(exist true):表示该属性为数据库表字段。 Mybatis-Plus 插件有这个功能,可以看一下 TableName:数据库表相关 TableId&#xff1…

从技术总监到开源社区运营:过去两年,我都做了点啥?

这是头哥侃码的第267篇原创今天,这是我离开前公司的第 7 天。相信有不少吃瓜群众都很好奇,你这些天都在干啥?是不是蓬莱乐逍遥,过上了那悠闲的神仙日子?还是趁着疫情管控逐渐放开,和家人一起去深山老林里吸…

查看模拟器使用端口_为什么我们仍然使用模拟音频端口?

查看模拟器使用端口When leaks about what the chassis of the iPhone 7 might look like hit headlines earlier this week, technology columnists and industry analysts jumped on the chance to report that Apple’s next device may finally ditch its 3.5mm audio port…

ServletContextListener在Springboot中的使用

ServletContextListener是servlet容器中的一个API接口, 它用来监听ServletContext的生命周期,也就是相当于用来监听Web应用的生命周期。今天我们就来说说如何在Springboot 1.5.2这个轻量型框架中如何使用它。 其实配置ServletContextListener与其它Filter, Listener…

《ASP.NET Core 6框架揭秘》实例演示[34]:缓存整个响应内容

我们利用ASP.NET开发的大部分API都是为了对外提供资源,对于不易变化的资源内容,针对某个维度对其实施缓存可以很好地提供应用的性能。《内存缓存与分布式缓存的使用》介绍的两种缓存框架(本地内存缓存和分布式缓存)为我们提供了简…

常见端口介绍

Win常用端口 TCP端口(静态端口)TCP 0 ReservedTCP 1TCP Port Service MultiplexerTCP 2DeathTCP 5Remote Job Entry,yoyoTCP 7EchoTCP 11SkunTCP 12BomberTCP 16SkunTCP 17SkunTCP 18消息传输协议,skunTCP 19SkunTCP 20FTP Data,Amanda TCP 2…