Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >后端Rabc权限控制

后端Rabc权限控制

作者头像
以谁为师
发布于 2023-09-12 01:39:01
发布于 2023-09-12 01:39:01
30700
代码可运行
举报
运行总次数:0
代码可运行

权限控制范围:

  • 前端动态菜单
  • 前端按钮显示权限
  • 后端API请求限制

前端

权限列表

角色关联权限

用户权限

后端

获取当前用户权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# get /user/userinfo/
{
    "msg": "成功",
    "errors": "",
    "code": 20000,
    "data": {
        "id": 1,
        "username": "admin",
        "name": "管理员",
        "job": "",
        "mobile": "",
        "email": "admin@qq.com",
        "permissions": [
            "admin"
        ]
    }
}

自定义访问权限策略

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ezops/utils/permissions.py:

class UserLock(APIException):
    status_code = status.HTTP_400_BAD_REQUEST
    default_detail = '用户已被锁定,请联系管理员!!!'
    default_code = 'not_authenticated'
    #  "User account is disabled."

class RbacPermission(BasePermission):
    """
    自定义Rbac权限认证
    """
    @staticmethod
    def api_uri(uri):
        base_api = settings.BASE_API
        uri = '/' + base_api + '/' + uri + '/'
        return re.sub('/+', '/', uri)

    def has_permission(self, request, view):
        # -------------------- 白名单  -------------------- #
        for safe_url in settings.WHITE_LIST:
            if re.match('{}'.format(safe_url), request.path):
                logger.info("自定义rbac认证方式: 白名单接口")
                return True
        # -------------------- admin 管理员白名单  -------------------- #
        if 'admin' in request.user.roles.values_list('name', flat=True) or request.user.is_superuser: 
            logger.info("自定义rbac认证方式: admin 放行")
            return True

        if request.user.is_active:
            if False:  # 禁用redis
            # if settings.REDIS_STATUS:
                # -------------------- 缓存rbac  -------------------- #
                logger.info(f"自定义rbac认证方式: redis缓存规则, userId:{request.user.id}")
                orm_userinfo = Users.objects.get(pk=request.user.id).get_user_info()  
                logger.info(f"orm_userinfo:{orm_userinfo}")
                conn = get_redis_connection('user_info')
                url_keys = conn.hkeys('user_permissions_manage')
                for url_key in url_keys:
                    if re.match('{}'.format(self.api_uri(url_key.decode())), request.path):
                        redis_key = url_key.decode()
                        break
                    else:
                        return True
                permissions = json.loads(conn.hget('user_permissions_manage', redis_key).decode())
                method_hit = False
                # -------------------- 同一接口配置不同权限验证  -------------------- #
                for permission in permissions:
                    if permission.get('method') == request.method:
                        method_hit = True
                        if permission.get('sign') in orm_userinfo['permissions']:
                            info = 'sign: {}'.format(permission.get('sign'))
                            logger.info(info)
                            return True
                        else:
                            if method_hit:
                                return False
                            else:
                                 return True
            else:
                # -------------------- 数据库中权限列表  -------------------- #
                logger.info("自定义rbac认证方式: 数据库规则")
                permissions = Permission.objects.all()
                user_permissions_manage = {}
                for i in permissions:
                    if  not i.menu and i.path:
                        user_permissions_manage[i.sign] = { 'path':i.path,'method':i.method,'id':i.id}
                # -------------------- 用户permissions -------------------- #
                orm_userinfo = Users.objects.get(pk=request.user.id).get_user_info()  
                logger.info(f"用户userinfo:{orm_userinfo}")
                logger.info(f"user_permissions_manage:{user_permissions_manage}")
                # -------------------- 匹配路径和method -------------------- #
                for permission in user_permissions_manage:
                    user_permission_path = self.api_uri(user_permissions_manage[permission]['path'])
                    if re.match(user_permission_path,request.path) : # 请求路径匹配
                        if  request.method == user_permissions_manage[permission]['method'] and permission in orm_userinfo['permissions']:
                            info = '[+] {} {} {}'.format(user_permission_path,user_permissions_manage[permission]['method'],permission)
                            logger.info(info)
                            return True
                        else:
                            info = '[+] GET url: {} - {} - {}'.format(request.path,request.method,permission)
                            logger.info(info)
                            return True
        else:
            raise UserLock()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django 实现权限分组(权限控制实现 第三方满足不了需求)
在Django项目中新建permissions 引入库 from django.core.exceptions import ObjectDoesNotExist from rest_framework.permissions import BasePermission from xxx import models 实现代码 class CanAccess(BasePermission): def has_permission(self, request, view): kong_u
简单、
2018/07/17
7430
初识ABP vNext(4):vue用户登录&菜单权限
几乎所有的系统都绕不开登录功能,那么就从登录开始,完成用户登录以及用户菜单权限控制。
xhznl
2020/08/20
2.3K0
初识ABP vNext(4):vue用户登录&菜单权限
👀探秘微服务:从零开启网关 SSO 服务搭建之旅
单点登录(Single Sign-On,简称SSO)是一种认证机制,它允许用户只需一次登录就可以访问多个应用程序或系统。在使用SSO时,用户只需要提供一次凭据(用户名和密码等),就可以访问多个系统,而无需在每个系统中都进行登录认证。
codetrend
2024/12/16
2600
SpringBoot权限管理实战:从入门到精通
在现代Web应用开发中,权限管理是不可或缺的核心功能。SpringBoot作为Java领域最流行的框架之一,提供了强大的安全支持。本文将带你全面了解如何在SpringBoot应用中实现完善的权限管理系统。
编程小白狼
2025/04/20
2660
Python进阶42-drf框架(四)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
1.8K0
Python进阶42-drf框架(四)
Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制
方志朋
2017/12/29
3.2K0
Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制
前后端分离的流程设计
这里需要提两个概念,一个是本地前端,另外一个是平台前端,本地前端是在内部迭代使用,界面可以简单一些,功能为主;平台前端是一个具有全局规划性的前端技术,简单来说,这是专业前端,会考虑用户体验度等等。
jeanron100
2018/07/26
6010
前后端分离的流程设计
Django REST 框架详解 07 | 三大认证与权限六表
基于用户角色权限访问的控制 (RBAC,Role Based Access Control):Django 框架使用
白墨石
2021/01/12
1.6K0
Django rest framework源码分析(2)----权限
添加权限 (1)API/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # utils/permission.py class SVIPPremission(object): message = "必须是SVIP才能访问" def has_permission(self,request,view): if request.user.user_type != 3: return False
zhang_derek
2018/04/11
9430
Django rest framework源码分析(2)----权限
Python自动化开发学习19-Djan
接下来,我们把Django分为视图(View)、路由系统(URL)、ORM(Model)、模板(Templates )这4块进行学习。
py3study
2020/01/06
1.5K0
Django权限系统auth模块详解
auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理。auth可以和admin模块配合使用, 快速建立网站的管理系统。
菲宇
2022/12/21
1.8K0
基于实战的方案选型策略:以Web系统权限设计为例
在实际开发过程中,面对一个需求,我们往往不缺“可行方案”,而是缺少“最合适的落地方案”。本篇文章将从一个典型的实际场景出发——Web系统的权限管理模块,来讲解在实战中如何进行有效的方案选型,并最终稳定落地。
一键难忘
2025/05/07
5590
django rbac权限
> startapp rbac models.py from django.db import models class User(models.Model): name=models.CharField(max_length=32) pwd=models.CharField(max_length=32) roles=models.ManyToManyField(to="Role") def __str__(self): return self.name class R
py3study
2020/01/19
8430
前端如何配合后端完成RBAC权限控制
承蒙 D2Projects开源组 的邀请,就写了这篇文章,平时写的不多,失误之处,请大家多多包涵。
FairyEver
2019/07/26
2.6K0
Django框架的权限组件rbac
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间都是多对多的关系。
菲宇
2019/06/13
2.4K0
Django框架的权限组件rbac
基于RBAC模型的SpringSecurity权限控制能力
全名为:Role-Based Access Control 译为基于角色的访问控制。
关忆北.
2020/12/25
1.3K0
使用Django快速搭建reportServer
最近想开发一个基础的服务(reportServer), 提供管理测试报告的相关功能
我是胖虎啊
2022/12/20
2890
使用Django快速搭建reportServer
运维平台中RESTful的Token认证
在近期要做的RESTful服务API化的过程中,对于开放的API还是需要考虑基本的安全认证的,如果API能够随便被调用,可能对于功能来说是畅通的,如果调用模式固定了之后,再加上更强的安全机制,对于已有的业务流程都需要做加固,与其等到后来怨声载道,还不如提前安排,况且这个代价也不大。
jeanron100
2018/07/26
6630
Django权限机制的实现
权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活;用好权限机制,能让系统更加强大和健壮。因此,基于Django的开发,理清Django权限机制是非常必要的。 1.1 Django的权限控制
菲宇
2019/06/13
1.2K0
Django权限机制的实现
DRF比Django的认证和权限高在哪里
Django可以用LoginRequiredMixin和PermissionRequiredMixin给类视图添加认证和权限,DRF做了高级封装,提供了更简洁的实现方式。我们通过继续学习官网教程来进行了解。
dongfanger
2020/12/22
1.6K0
DRF比Django的认证和权限高在哪里
相关推荐
Django 实现权限分组(权限控制实现 第三方满足不了需求)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验