前后端常见的几种鉴权方式(小结)

前后端常见的几种鉴权方式(小结)

1. 基于Token的鉴权方式

Token(令牌)是指在Web开发中,保留客户端登录状态的一种机制。具体实现方式为:当用户使用用户名和密码进行登录后,系统生成一个特定的Token,并返回给客户端。此后客户端必须携带此Token才能访问受保护的资源。

具体流程如下:

  1. 客户端发送登录请求;
  2. 服务端验证用户信息;
  3. 登录成功后,生成Token,并返回给客户端;
  4. 客户端收到Token后,在每次请求时都附加在请求头中;
  5. 服务端对每次请求的Token进行校验,如果校验通过,则返回结果,否则拒绝请求。

如下是一个示例验证过程的代码实现,包括生成Token、校验Token、鉴权等具体步骤:

import jwt

# 生成Token函数
def generate_token(user_id):
    # 设置Token过期时间
    exp = datetime.datetime.utcnow() + datetime.timedelta(days=1)
    # 放入用户的id,并设置过期时间
    return jwt.encode({'user_id': user_id, 'exp': exp}, 'my_secret_key', algorithm='HS256')

# 校验Token函数
def verify_token(token):
    try:
        # 解码Token,获取用户id信息
        payload = jwt.decode(token, 'my_secret_key', algorithms=['HS256'])
        # 判断Token是否过期
        if payload['exp'] < datetime.datetime.utcnow():
            raise jwt.ExpiredSignatureError
    except (jwt.InvalidSignatureError, jwt.DecodeError, jwt.ExpiredSignatureError):
        # Token校验失败,则返回None
        return None
    # 校验通过,返回用户id
    return payload['user_id']

# 鉴权函数
def authenticated(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 获取Token
        token = request.headers.get('Authorization')
        if token is None:
            # Token未提供,返回错误信息
            raise Unauthorized
        # 校验Token
        user_id = verify_token(token)
        if user_id is None:
            # Token校验失败,返回错误信息
            raise Unauthorized
        # 鉴权通过,返回结果
        return func(*args, **kwargs)
    return wrapper

# 测试代码
@app.route('/protected_resource')
@authenticated
def protected_resource():
    return 'This is a protected resource'

2. 基于Session的鉴权方式

Session(会话)是指客户端和服务器之间建立的一种持久连接,用于保持用户登录状态等。具体实现方式为:当用户使用用户名和密码进行登录后,服务端在服务器上创建一个Session,并将该Session的唯一标识(Session ID)返回给客户端。此后客户端每次发送请求时,都要附带该Session ID,以便服务端能够识别该请求是否是登录用户的请求。

具体流程如下:

  1. 客户端发送登录请求;
  2. 服务端验证用户信息;
  3. 登录成功后,创建一个Session,并将Session ID返回给客户端;
  4. 客户端收到Session ID后,在每次请求时都附加在请求头中;
  5. 服务端对每次请求的Session ID进行校验,如果校验通过,则返回结果,否则拒绝请求。

如下是一个示例验证过程的代码实现,包括创建Session、校验Session、鉴权等具体步骤:

# 创建Session函数
def create_session(user_id):
    session_id = uuid.uuid4().hex
    redis_client.set(session_id, user_id, ex=3600)
    return session_id

# 校验Session函数
def verify_session(session_id):
    user_id = redis_client.get(session_id)
    if user_id is None:
        # Session校验失败,返回错误信息
        raise Unauthorized
    return user_id

# 鉴权函数
def authenticated(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 获取Session ID
        session_id = request.headers.get('Session-ID')
        if session_id is None:
            # Session未提供,返回错误信息
            raise Unauthorized
        # 校验Session
        user_id = verify_session(session_id)
        # 鉴权通过,返回结果
        return func(*args, **kwargs)
    return wrapper

# 测试代码
@app.route('/protected_resource')
@authenticated
def protected_resource():
    return 'This is a protected resource'

3. 基于权限的鉴权方式

基于权限的鉴权方式是指通过授权,给予用户访问特定资源的权限,从而实现鉴权的一种方式。授权的方式可以通过以下两种方式进行:

  1. 角色授权:将具有相似权限的用户归为同一角色,并给予这些角色特定的访问权限;
  2. 用户授权:针对每个用户,给予其特定的访问权限。

具体流程如下:

  1. 客户端发送登录请求;
  2. 服务端验证用户信息;
  3. 登录成功后,根据用户角色或者用户特定权限,返回相应的访问权限;
  4. 客户端在请求时携带相应的权限信息;
  5. 服务端根据接收到的权限信息,进行鉴权。

如下是一个示例验证过程的代码实现,包括权限管理、校验权限、鉴权等具体步骤:

# 权限管理
permissions = {
    'admin': ['view_users', 'edit_users', 'delete_users', 'view_inventory', 'edit_inventory', 'delete_inventory'],
    'finance': ['view_users', 'view_inventory', 'view_sales'],
    'sales': ['view_users', 'edit_users', 'view_inventory', 'view_sales', 'edit_sales']
}

# 校验权限函数
def verify_permission(user_id, permission):
    user = get_user(user_id)  # 获取用户信息
    if user is None:
        raise Unauthorized
    if permission not in user['permissions']:
        raise Forbidden

# 鉴权函数
def authenticated(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 获取Token或者Session ID
        token = request.headers.get('Authorization')
        session_id = request.headers.get('Session-ID')
        if token is None and session_id is None:
            # 无法确定用户身份,返回错误信息
            raise Unauthorized
        # 根据Token或者Session ID获取用户信息
        if token is not None:
            user_id = verify_token(token)
        else:
            user_id = verify_session(session_id)
        # 根据用户信息和访问权限进行鉴权
        verify_permission(user_id, 'view_users')
        # 鉴权通过,返回结果
        return func(*args, **kwargs)
    return wrapper

# 测试代码
@app.route('/protected_resource')
@authenticated
def protected_resource():
    return 'This is a protected resource'

通过以上示例,我们可以看到基于Token、Session、权限这三种方式,都具有其特定的优缺点,需要在实际项目中具体情况具体分析。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:前后端常见的几种鉴权方式(小结) - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • nodejs 的 session 简单使用

    当使用 Node.js 的 Express 框架进行 Web 开发时,我们通常需要使用 session 来存储用户登录状态等信息。这里是一个 Node.js session 的简单使用攻略。 安装相关依赖 Session 是通过中间件实现的,我们需要安装 session 相关依赖: npm install express-session 引入 session…

    node js 2023年6月8日
    00
  • 学习Node.js模块机制

    学习Node.js模块机制可以分为以下几个步骤: 1. 了解模块机制概念 在Node.js中,每个文件都被视为一个模块,模块机制通过exports对象暴露模块中的函数、变量等,使其可在其他模块被调用。模块机制使用CommonJS规范来实现模块化。 2. 导出模块 要导出一个模块,需要用module.exports 或 exports 将需要导出的函数、变量等…

    node js 2023年6月8日
    00
  • 深入理解angular2启动项目步骤

    以下是“深入理解Angular2启动项目步骤”的完整攻略: Angular2启动项目步骤 步骤一:安装Node.js和npm Node.js是一种基于Chrome V8引擎的JavaScript运行时,可以使JavaScript代码在服务器端运行。而npm(Node Package Manager)是随同Node.js一起安装的包管理器,用于安装并管理Nod…

    node js 2023年6月9日
    00
  • Node.js实现分片上传断点续传示例详解

    首先,为了实现分片上传断点续传,我们需要使用Node.js提供的相关模块和技术。具体来说,我们需要用到http模块和fs模块。 步骤如下: 1.创建一个基于http模块的服务器,用于接收上传的文件,并为每一个上传的文件创建一个唯一的标识(例如文件名、UUID等),并将这些标识保存到一个数组中,以便用于断点续传。 示例代码: const http = requ…

    node js 2023年6月8日
    00
  • 如何在Nodejs中使用模块fs文件系统

    想要在Node.js中使用文件系统模块(fs),需要先引入该模块。在Node.js中,引入模块的方式是使用require函数,如下所示: const fs = require(‘fs’); 引入模块后,就可以使用该模块中提供的方法来读取、写入文件等操作。下面详细讲解如何在Node.js中使用文件系统模块(fs)。 读取文件内容 使用fs模块可以读取本地计算机…

    node js 2023年6月8日
    00
  • Nodejs实现用户注册功能

    下面是Nodejs实现用户注册功能的完整攻略: 1. 创建注册页面 首先需要创建一个注册页面,可以使用HTML、CSS、JavaScript创建。在HTML表单中包含用户名、密码、邮箱等输入框,以及提交按钮等元素。这里举一个HTML页面创建代码的例子: <!DOCTYPE html> <html> <head> <t…

    node js 2023年6月8日
    00
  • Nodejs异步回调之异常处理实例分析

    Node.js异步回调是Node.js非常重要的特性之一,但是它可能引发异常或错误。所以在开发过程中,我们需要有效地处理异常和错误。 下面是一个基本的异步操作示例,使用了Node.js中的fs模块读取文件: const fs = require(‘fs’); fs.readFile(‘/file.txt’, (err, data) => { if (e…

    node js 2023年6月8日
    00
  • Node.js进程退出的深入理解

    Node.js进程退出的深入理解 Node.js进程退出是一个非常重要的问题,在应用程序开发中经常会遇到各种问题,例如应用程序崩溃、进程无法退出等等,所以我们需要深入理解Node.js进程退出的原理及技巧,以避免这些问题的发生。 Node.js进程退出的原理 在Node.js中,进程的退出分为两种情况: 程序正常退出 程序异常退出 在程序正常退出的情况下,可…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部