欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

django 用户与权限管理

程序员文章站 2022-06-05 18:17:31
django中使用content_type表进行存储app与model的关系。在permission表中设立了name(权限的名字,中英文均可)content_type_id(与content_type是外键关系,用于绑定model)codename(在写代码时使用的权限名)那么如何自定义权限呢? ......

django中使用content_type表进行存储app与model的关系。在permission表中设立了name(权限的名字,中英文均可)content_type_id(与content_type是外键关系,用于绑定model)codename(在写代码时使用的权限名)那么如何自定义权限呢?

一、自定义权限

实例代码:

def add_permission(request)
        '''自定义创建新的权限'''
        # 获取model在content_type对象
        content_type = contenttype.objects.get_for_model(article)    
        permission = permission.objects.create(codename='black_article', name='拉黑文章', content_type=content_type)
        return httpresponse('权限创建成功')

或者,在建立model时就添加上:

    class article(models.model):
        title = models.charfield(max_length=64, verbose_name="标题")
        content = models.textfield(verbose_name="内容")

        class meta:
            db_table = 'article'
            permissions = [
                ('black_article', '拉黑文章')
        ]

二、用户与权限绑定

权限本身只是一个数据,必须和用户进行绑定,才能起到作用。user模型和权限之间的管理,可以通过以下几种方式来管理:

1、mysuer.user_permissions.set(permission_list): 直接给定一个权限的列表。
2、mysuer.user_permissions.add(permission, permission,...): 一个个添加权限。
3、mysuer.user_permissions.remove(permission, permission,...): 一个个删除权限。
4、myuser.user_permissions.clear(): 清除权限。
5、myuser.get_all_permissions(): 获取所有的权限。
6、myser.has_perm('<app_name>.<codename>'): 判断是否拥有某个权限。权限参数时一个字符串,格式是:app_name.codename
实例代码:

def user_add_permission(request):
        '''用户权限实例'''
        # 获取当前登录的用户对象
        user = request.user
        # 获取app01的所有权限
        content_type = contenttype.objects.get_for_model(app01)
        permissions = permission.objects.filter(content_type=content_type)
        # 为当前用户添加app01的所有权限
        # 方式一
        user.user_permissions.set(permissions)
        # 方式二
        user.user_permissions.add(permissions[1], permissions[2])
        user.save()
        # 或者使用这个原理:*[1,2,3] = 1,2,3进行添加
        user.user_permissions.add(*permissions)
        user.save()
        # 查看当前用户的所有权限
        print(user.get_all_permissions())
        # 删除当前用户所有权限
        user.user_permissions.clear()
        return httpresponse('査看权限')

三、分组操作

1、group.object.create(group_name):创建分组
2、group.permissions : 某个分组上的权限。多对多的关系。
1> group.permissions.add : 添加权限
2> group.permissions.remove : 移除权限
3> group.permissions.clear : 清除所有权限
4> user.get_group_premissions() : 获取用户所属组的权限。
3、user.groups : 某个用户上的所有分组。多对多的关系。

示例代码如下:

def operate_group(request):
        group = group.object.create(name='编辑')  # 创建编辑这个分组
        content_type = contenttype.object.get_for_model(article) #
        permissions = permission.object.filter(content_type=content_type) # 获取article表创建的所有权限
        # 添加权限
        group.permissions.set(permissions) # 方式一:直接将所有权限添加
        group.permissions.add(*permissions) # 方式二:将所有权限添加
        group.permissions.add([permissions[0],permissions[1]) # 添加指定的权限
        group.save()
        # 将用户添加到分组
        group = group.object.filter(name='编辑').first()
        user = user.object.first()
        user.group.add(group)
        user.save()
        return httpresponse('成功')

四、在模版中使用权限管理:

在settings.templates.options.context_processors下,因为添加了django.contrib.auth.context_processors.auth上下文处理器,因此在模版中可以直接通过perms来获取用户的所有权限。示例代码如下:

{% if perms.模型名.权限名 %}  //拥有该权限名才会看到下面的链接
        <a href = '/article/'>文章</a>
{% endif %}