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

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

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中创建cluster

    下面是关于“浅谈nodejs中创建cluster”的完整攻略,其中包含两个示例说明。 什么是Cluster(集群)? Cluster是Node.js中的一个内置模块,它提供了一种创建多进程应用程序的方法,可以通过将单个Node.js进程的工作负载分配给多个子进程来提高应用程序的性能和可伸缩性。 如何使用Cluster? 创建一个集群的过程包括以下步骤: 引入…

    node js 2023年6月8日
    00
  • mongoose设置unique不生效问题的解决及如何移除unique的限制

    当使用 Mongoose 建立文档时,我们经常使用 unique 属性来保证某些字段的唯一性。但是,在实际开发过程中,我们可能会遇到设置了 unique 但并没有起到限制作用的问题。以下是 mongoose 设置 unique 不生效问题的解决方案及如何移除 unique 限制的攻略。 问题分析 在 Mongoose 中设置的 unique 属性不起作用,通…

    node js 2023年6月8日
    00
  • javascript中FOREACH数组方法使用示例

    下面我就为你详细讲解一下“javascript中FOREACH数组方法使用示例”的完整攻略。 FOREACH方法简介 FOREACH方法是 JavaScript 中 Array 对象定义的方法,用于对数组中的元素进行遍历操作。与传统循环不同的是,FOREACH方法不需要我们自己去编写循环变量、循环条件和循环增量等等。 FOREACH方法的语法 array.f…

    node js 2023年6月8日
    00
  • node模块机制与异步处理详解

    Node模块机制与异步处理详解 1. Node模块机制 Node的模块机制是通过CommonJS规范实现的,它允许我们将代码封装成可重用的模块,并在不同的文件中进行引用。Node中有三种类型的模块: 核心模块:Node内置的模块,例如fs和http。 文件模块:位于本地文件系统中的模块,通过相对或绝对路径引用。 第三方模块:由NPM管理的模块,可以通过req…

    node js 2023年6月8日
    00
  • 在JS循环中使用async/await的方法

    当在JavaScript中使用循环时,通常我们会面临一个问题,即如何同时异步执行循环体中的多个异步操作,并在它们都完成后执行下一步操作。对于这种情况,我们可以使用async/await结合并发循环来解决这个问题。 使用Promise.all结合循环并发执行异步操作 一种常见的使用async/await结合并发循环的方法是使用Promise.all。假设我们有…

    node js 2023年6月8日
    00
  • 浅析node连接数据库(express+mysql)

    下面我将详细讲解“浅析node连接数据库(express+mysql)”的完整攻略。 1. 什么是Node连接数据库 在使用Node.js搭建Web服务器时,经常需要与数据库进行交互,用来操作数据库的MySQL数据库是目前最为流行的开源数据库之一。Node.js通过库文件mysqljs来实现对MySQL数据库的连接和操作。 2. 使用Node连接MySQL数…

    node js 2023年6月8日
    00
  • JS通过调用微信API实现微信支付功能的方法示例

    这里是“JS通过调用微信API实现微信支付功能的方法示例”的完整攻略。 简介 随着移动支付的快速普及,微信支付也成为了越来越多用户的选择。对于网站或App开发者,将微信支付集成到自己的应用中成为了一个重要的问题。本文主要介绍如何使用JavaScript通过调用微信API实现微信支付功能。 准备工作 在使用JavaScript通过调用微信API实现微信支付功能…

    node js 2023年6月8日
    00
  • 用js实现的一个根据内容自动生成表格的函数

    实现“根据内容自动生成表格”的函数,主要需要用到JavaScript的DOM操作和字符串操作。具体的实现思路如下: 通过JavaScript选择需要生成表格的HTML元素,并创建table和tbody元素作为表格的基础结构。 通过JavaScript获取要生成表格的数据,并按照一定的规则把数据转化成HTML表格的形式,具体方法可以使用字符串拼接的方式或者模板…

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