django 用户与权限管理

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时就添加上:

from django.contrib.auth.models import ContentType, Permission

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.APP名.权限名 %}  //拥有该权限名才会看到下面的链接
        <a href = '/article/'>文章</a>
{% endif %}
posted @ 2019-12-20 20:47  xsan  阅读(4493)  评论(0编辑  收藏  举报