数据库事务、 web登录认证授权基础

发布于:2022-12-23 ⋅ 阅读:(464) ⋅ 点赞:(0)

1.数据库事务

概念:

数据库的事务是一种机制,一个操作序列,包含了一组数据库的操作命令;事务把所有的命令都作为一个整体一起向系统提交或撤销操作,即这一组数据库命令要么同事成功,要么同时失败;我们把事务看作是一个不可分割的工作逻辑单元;

事务管理关键字:

MySQL事务管理:

--开启事务 --START TRANSACTION 或者 BEGIN;

--提交事务 --COMMIT;

--回滚事务 --ROLLBACK;

JDBC事务管理:Connection接口定义了3个对应的方法:

--开启事务 :setAutoCommit(boolean) :true为自动提交事务;false为手动提交事务,即开启事务;

--提交事务 :commit();

--回滚事务 :rollback();

在java里面使用异常处理机制 try catch来进行事务运行管理的代码编写;

事务的四大特征:

原子性(Automicity):事务是不可分割的最小操作单位,要么同时成功,要么失败;

一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态(数据总额不发生变化);

隔离性(Isolation):多个事务(多个操作窗口)之间,操作的可见性;隔离性越强,操作越不可见,性能越低,反之性能越高;

持久性(Durability):事务一旦提交或者回滚,它对数据库的改变就是永久的;

事务的默认自动提交:

我们知道在进行数据更改的时候,数据是会实时变更的,这是因为数据库默认就是自动提交数据的;

可以通过:select @@autocommit;语句来查询它的提交方式,默认的值是1;

可以通过:set @@autocommit = 0;语句来修改它的提交方式为手动,这样如果要永久性地修改数据,
就必须要手动提交;

在spring mvc模型里,在service层里通过加注解:@Transactional ,该注解可用于方法、实现类、接口上,被注解的方法需要声明在接口里面,因为该注解是基于动态代理实现的,就是在方法前后增加开启,提交事务的逻辑,而事物的回滚基于异常的捕捉

2.分清cookie,session,token

2.1、基础概念

Http是一种无状态的协议(对于事务处理没有记忆能力,服务端不会保存任何会话信息,如果想要跟踪会话,需要主动维护一个信息去保留会话信息,这个信息可以是cookie或者session)

现在上网想要对服务器发送请求一般都要进行登录操作,而登录操作以及后续请求是基于认证、授权与凭证这几种操作;

认证 (Authentication):通俗来说,就是证明自己的身份,一般用于登录操作、手机接收验证码;

授权(Ahthorization):用户授予第三方应用访问该用户某些资源的权限,实现授权的方式有:cookie,session,token;

凭证(Credentials):实现认证与授权的前提,是一种媒介(证书)来标记发起请求者的信息;比如在博客、微博上,未登录的游客可以看帖,但发帖需要登录,是基于凭证来区分有没有登录的;

2.2、Cookie

cookie是服务器发送给客户端并保存在客户端本地的信息,它会随着客户端的下一次请求一起被送给服务器;cookie是不可跨域的,每个cookie都会绑定一个单一的域名,无法在别的域名下获取使用(一级域名和二级域名之间允许共享);

cookie的一些重要属性
属性 说明
name=value 键值对,设置 Cookie 的名称及相对应的值,都必须是字符串类型
- 如果值为 Unicode 字符,需要为字符编码。
- 如果值为二进制数据,则需要使用 BASE64 编码。
domain 指定 cookie 所属域名,默认是当前域名
path 指定 cookie 在哪个路径(路由)下生效,默认是 '/'。如果设置为 /abc,则只有 /abc 下的路由可以访问到该 cookie,如:/abc/read
maxAge

cookie 失效的时间,单位秒。如果为整数,则该 cookie 在 maxAge 秒后失效。如果为负数,该 cookie 为临时 cookie ,关闭浏览器即失效,浏览器也不会以任何形式保存该 cookie 。如果为 0,表示删除该 cookie 。默认为 -1。

expires 过期时间,在设置的某个时间点后该 cookie 就会失效。一般浏览器的 cookie 都是默认储存的,当关闭浏览器结束这个会话的时候,这个 cookie 也就会被删除
secure 该 cookie 是否仅被使用安全协议传输。安全协议HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。
当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效。
httpOnly 如果给某个 cookie 设置了 httpOnly 属性,则无法通过 JS 脚本 读取到该 cookie 的信息,但还是能通过 Application 中手动修改 cookie,所以只是在一定程度上可以防止 XSS 攻击,不是绝对的安全

2.3、session

session是基于cookie实现的,是一种记录会话状态的机制,session是储存到服务器端里,但会发送sessionID给客户端的cookie里,并记录它的域名,等到客户端下次发送请求给服务器时,会先判断该域名下是否存在cookie,如果存在就发送cookie给服务器,里面携带了sessionID,通过sessionID查找对应的session,就可以重新建立会话状态;这种技术通常用于登录验证;

session与cookie的区别:

  • 安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。
  • 存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。
  • 有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。
  • 存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。

2.4、Token

是一种访问资源时所需的凭证,简单的token由uid(用户唯一身份标识)、time(当前时间戳)、sign(签名),它的特点有:

  • 服务端无状态化、可扩展性好
  • 支持移动端设备
  • 安全
  • 支持跨程序调用
  • 每一次请求都需要携带 token,需要把 token 放到 HTTP 的 Header 里
  • 基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库
  • token 完全由应用管理,所以它可以避开同源策略

Token的身份验证流程

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端
  4. 客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据

Token 和 Session 的区别

  • Session 是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。而 Token 是令牌访问资源接口(API)时所需要的资源凭证。Token 使服务端无状态化,不会存储会话信息。
  • 作为身份认证 Token 安全性比 Session 好,因为每一个请求都有签名还能防止监听以及重放攻击,而 Session 就必须依赖链路层来保障通讯安全了因为session的信息安全保障在于sessionID的未知,sessionID却只能保存在本地,不应该共享给第三方,因此session是不允许客户端去共享数据或者API接口给第三方,而token却能做到这一点,并保证了安全;

2.5、JWT

JSON WEB TOKEN,是目前最流行的跨域认证的解决方案;

它是一种基于JSON,为了在网络应用环境间传递声明而执行的一种标准(RFC 7519);例如:在用户和服务器间传递被认证的用户身份信息,以便于从服务器获取资源。

JWT的认证流程

 JWT的特点

  • 服务端的保护路由将会检查请求头 Authorization 中的 JWT 信息,如果合法,则允许用户的行为
  • 因为 JWT 是自包含的(内部包含了一些会话信息),因此减少了查询数据库的需要
  • 因为 JWT 并不使用 Cookie ,所以你可以使用任何域名提供你的 API 服务,而不需要担心跨域资源共享问题(CORS)
  • 因为用户的状态不再存储在服务端的内存中,所以这是一种无状态的认证机制

JWT的使用方式:

  • 存储在cookie里,这种方式可以随cookie而自动发送出去,缺点是无法做跨域访问;
  • 存在HTTP请求头的Authorization字段里,通过Bearer模式添加JWT;它的优点是不担心跨域资源共享问题(CORS);
  • 存在POST请求的数据体里;
  • 存在URL里面;

TOKEN与JWT的区别:

相同点:

都是访问资源的令牌;都可以记录用户的信息;都是使服务器无状态化(可以使服务器不用存状态信息);可以对请求做验证;

不同点:

token需要查询查询数据库以验证用户信息;JWT是将TOKEN与PAYLOAD(载荷)加密,服务端只需要使用密钥进行解密并检验,就可以完成验证,不需要查询数据库;

 


 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到