zoukankan      html  css  js  c++  java
  • 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 %}
  • 相关阅读:
    pixysoft.framework.messageflow enterprise edition 开发实录
    软件工程革命三部曲 — 系统开发分类与重用说明
    vs2010 premium版本 使用小结 更多是问题。。
    报表引擎终于做出来了!!!
    报表引擎终于做出来了!!!!!参考了根兄的文档。
    页面驱动开发(Page Driven) —— 一种大多数人还不认同的技术
    从SOA到云计算 我个人理解
    谈谈Exception,什么时候抛出?什么时候接住? 二
    软件工程革命三部曲 —— 系统开发的业务部分重构在思考。
    Pixysoft.Framework.Reports 开发实录
  • 原文地址:https://www.cnblogs.com/xshan/p/12074991.html
Copyright © 2011-2022 走看看