【问题标题】:How to implement dynamic creation of permission groups with different set of endpoints Django Rest Framework如何使用不同的端点集实现权限组的动态创建 Django Rest Framework
【发布时间】:2021-05-12 23:05:56
【问题描述】:

在我的项目中,我有很多端点视图(APIViews、ViewSets)。现在我为所有这些设置权限,其中一些是默认的(例如 AllowAny),一些是自定义创建的:

permission_classes = (IsUserHaveSomePermission,)

现在我想实现一些灵活的系统,这将允许我为每个用户指定一组允许的端点,例如:

在前端我想选择一些用户并有一个对应于项目端点的复选框列表。

这只是一个乌托邦式的解决方案,一些细节可能会改变,但主要问题是如何制作类似的东西,以便管理员基本上可以动态地为用户更改允许的端点/视图列表? 提前致谢

【问题讨论】:

    标签: rest design-patterns django-rest-framework architecture django-permissions


    【解决方案1】:

    这个方案可以通过存储用户是否有权限访问当前的请求方法和请求路径来实现。

    创建一个新的数据库模型,用于存储用户、请求方法和请求路径。假设模型的名称是 RequestPermission

    您可以存储一个表示 url 的常量来代替路径,以便您以后可以灵活地编辑路径。这个常量可以是django支持的url name

    class RequestPermission(models.Model):
        user = user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='request_permissions')
        method = models.CharField(max_length=10)
        path_name = models.CharField(max_length=200)
    

    创建自定义权限类:

    class IsUserResuestAllowed(permissions.BasePermission):
    
        def has_permission(self, request, view):
            user = request.user
            # you can choose how to get the path_name from the path
            path_name = get_path_name(request.path)
            return RequestPermission.objects.filter(user=user, method=request.method, path_name=path_name).exists()
    

    现在您可以将此类用作休息框架设置中的默认权限类或在每个视图中使用它。

    【讨论】:

    • 是的,我考虑过类似的解决方案,但在这里我仍然需要对所有现有路径名及其 http 方法进行硬编码。我希望我可以有一些函数get_api_endpoints(),它会返回一些像[{url: 'api/v1/endpoint', name: 'url-path-name', methods: ['post', 'delete',...]}, ....] 这样的列表,这样我就可以轻松地将它们显示在某个地方。
    • 对于任何需要这种功能的人,我部分来自github.com/django-extensions/django-extensions/blob/master/… 注意:你所有的网址都应该有名字
    猜你喜欢
    • 1970-01-01
    • 2014-05-10
    • 2016-07-11
    • 2021-03-17
    • 1970-01-01
    • 2019-03-21
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多