前后端分离_权限认证设计_原理篇

前后端分离_权限认证设计_原理篇

前后端分离与传统的区别:

其实前后端分离与传统框架的区别就是一个是自动化状态管理,一个是自己管理,让我们来先看下传统的状态管理.

传统的状态管理:

传统的状态管理
通过上面的图,应该可以清晰的表示出传统的web应用状态的管理过程,都是围绕一个核心问题展开的:

服务器怎么知道我是哪个客户端,有没有登录过.

由此问题开始引申出如下问题:

  1. 服务端需要生成一个唯一身份认证.
  2. 服务端需要为每个唯一身份认证维护一个登陆状态.
  3. 客户端需要保存服务端产生并给出的唯一身份认证.
  4. 客户端每次请求需要带上服务端给的唯一身份认证.

那传统的状态管理都是如何解决上述问题的呢?
1,服务端自动生成:tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid.
2,根据sessionid为Key创建一个map保存登录状态,如果登录通过就保存为true,失败就为fasle.
3,客户端解析到sessionid后保存在本地的cookies文件里.
4,客户端每次请求查询相应的cookies把sessionid添加到请求头中进行身份认证.

看完了上面的讲解,现在明白了么?回到我们最初的问题:

传统的状态管理和前后端分离的状态管理的区别是什么?

现在可以回答这个问题:最大区别就是是否自动化,传统的web应用服务,上面的这一切都是自动化的,你不需要做什么,tomcat服务器和浏览器都帮你做好了,你不需要单独的写代码,实现什么,浏览器和服务器都自动进行着上面的工作,那我们可能要问,为什么前后端分离后要自己生成呢? 浏览器服务器不都给我干了么,答案很简单,因为有一个非常重要的问题就是,你要前后端分离就不可避免的要面对一个问题: 跨域!
一旦当你涉及到跨域访问的时候浏览器就不再自动给你干这个活了.
但是同样的如果你的应用只是前后端分离开发,但是部署同域!那就与普通的登录没有区别

延伸一下(为什么跨域就不自动帮你干活了):

举个例子:
你去银行柜台办理转账或者取款业务,营业员除了要求你有身份证外还需要验证一下头像和你的长相,判断你是否是本人,如果不是本人是不给你办理转账的,因为这样就可以避免有人捡到或者盗用你的身份证去把你的钱偷走,但是实际你肯定也是不希望他只那你的身份证就能代替你去取款的.那体现在浏览器是怎么解决这个问题的呢?

你每次用浏览器访问请求的时候,浏览器也会进行一个同源认证,这个同源认证就是为了保证你的身份证和你本人是同一个人的,同源认证需要三者一致:

  1. 协议相同
  2. 域名相同
  3. 端口相同

只有上面三者一致,浏览器才会自动取出相应的sessionid放入你的请求头中,以便你的请求可以在服务端得到认证,不一致就不会自动进行,那既然我们要实现跨域,域名和端口就不会保持一致,那怎么办? 那就只能我们自己实现或者改造这个过程了.

跨域方案(前后端分离方案)

方案一:(改动最小,不易扩展)

  1. 服务器照旧,浏览器端不再使用cookie进行sessionid的保存(实际最开始那几年好多应用都是这么干的,因为浏览器也是可以禁用cookie的).
  2. 浏览器保存sessionid,并在每次请求的时候取出请求到的sessionid.
    a. from表单保存,提交请求的时候自动请求.
    b.保存在LocalStorage,提交请求的时候取出来加到请求里.

方案二:(上下都改,易于扩展)

  1. 服务器禁用session,采用JWT将用户信息加密到token里,生成唯一值的token令牌.
  2. 服务器接到请求的时候如果登录成功,就把令牌放到response里面跟随其他信息一起返回给客户端.
  3. 客户端接收到返回的请求后,把token令牌的唯一值保存在LocalStorage中.
  4. 客户端每次发请求之前去LocalStorage中把令牌取出,使用带着令牌的请求到服务端进行状态认证.
接下来我将采用第二种方案,结合Spring boot+Spring security+jwt实现一套通用的权限系统,喜欢的可以了解关注一下.

总结:

简单的总结一下,因为有好多人只是听说前后端分离很火,然后就百度,很多时候不明就里的就使用了jwt等令牌框架技术了,其实不使用也是可以的,就是简单的在web里拦截一下sessionid,每次请求带上sessionid就这么简单就可以解决问题了,解决问题简单实用成本最低最好,单纯的追求"火","高端"不能说没有意义,只不过程序员应该寻求把时间放在更有价值的地方中去.在我的观念里,技术没有好坏之分,没有高低之分,用最简单,最合适的技术,用最快的速度去解决现有问题的技术才是最牛逼的技术!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值