`
zjxplq
  • 浏览: 40445 次
  • 性别: Icon_minigender_1
  • 来自: 绍兴
社区版块
存档分类
最新评论

admin管理界面实现object权限

阅读更多

 

学习http://www.b-list.org/weblog/2008/dec/24/admin/后记录(部分翻译)

在django admin管理界面下,如何使用户只能看到与编辑他们自己创建的内容.

自动填写user

在一个weblog中,Entry model如下:

 

import datetime

from django.contrib.auth.models import User
from django.db import models


class Entry(models.Model):
    title = models.CharField(max_length=250)
    slug = models.SlugField()
    pub_date = models.DateTimeField(default=datetime.datetime.now)
    author = models.ForeignKey(User, related_name='entries')
    summary = models.TextField(blank=True)
    body = models.TextField()

    class Meta:
        get_latest_by = 'pub_date'
        ordering = ('-pub_date',)
        verbose_name_plural = 'entries'

    def __unicode__(self):
        return self.title

    def get_absolute_url(self):
        return "/weblog/%s/%s/" % (self.pub_date.strftime("%Y/%b/%d"),
                                   self.slug)
 

第一个目标是为Entry model实现一个ModelAdmin,在创建新的Entry时,自动填入当前用户到author字段中.在admin.py中:

 

from django.contrib import admin

from blog.models import Entry


class EntryAdmin(admin.ModelAdmin):
    exclude = ('author',)
    list_display = ('title', 'pub_date', 'author')
    prepopulated_fields = { 'slug': ['title'] }

    def save_model(self, request, obj, form, change):
        if not change:
            obj.author = request.user
        obj.save()
admin.site.register(Entry, EntryAdmin)
 

 

通过重载save_model来实现.save_model的参数:request:当前的HttpRequest;obj:准备要保存的对象;form:用于验证数据的form;change:表示该对象是第一次保存还是编辑已存在的对象.只需在新建对象时需要保存写入author.

 

只显示自己创建的entries.

通过重载EntryAdmin的函数queryset来实现.代码如下:

  def queryset(self, request):

         return Entry.objects.filter(author=request.user)
      

但这样的话,连管理员也只能看到自己创建的entries了,所以这样是不完善的.作如下改进:

  def queryset(self, request):

        if request.user.is_superuser:
            return Entry.objects.all()
        return Entry.objects.filter(author=request.user)
   

上面所作的改进只对list view已作用.然而另一个函数has_change_permission是在单个对象编辑页面来调用的,确保用户是否有权限编辑对象.默认情况下,如用户有"change"权限的,这个函数返回True.所以得去重载这个函数,体现正确的权限.

  def has_change_permission(self, request, obj=None):

        has_class_permission = super(EntryAdmin, self).has_change_permission(request, obj)
        if not has_class_permission:
            return False
        if obj is not None and not request.user.is_superuser and request.user.id != obj.author.id:
            return False
        return True
   

完整的代码如下:

 

from django.contrib import admin

from blog.models import Entry


class EntryAdmin(admin.ModelAdmin):
    exclude = ('author',)
    list_display = ('title', 'pub_date', 'author')
    prepopulated_fields = { 'slug': ['title'] }

    def has_change_permission(self, request, obj=None):
        has_class_permission = super(EntryAdmin, self).has_change_permission(request, obj)
        if not has_class_permission:
            return False
        if obj is not None and not request.user.is_superuser and request.user.id != obj.author.id:
            return False
        return True

    def queryset(self, request):
        if request.user.is_superuser:
            return Entry.objects.all()
        return Entry.objects.filter(author=request.user)

    def save_model(self, request, obj, form, change):
        if not change:
            obj.author = request.user
        obj.save()


admin.site.register(Entry, EntryAdmin)
 

 

 

 

 

 

 

分享到:
评论

相关推荐

    httpmodule实现权限管理

    通过HTTP模块进行权限管理,我们可以实现在请求被路由到实际的页面或服务之前进行安全检查,从而提供更高效的安全控制。 首先,我们需要创建一个自定义的HTTP模块。在C#中,我们可以继承`System.Web.IHttpModule`...

    eladmin,项目基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue 的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 RBAC,支持数据字典与数据权限管理,前端菜单支持动态路由.zip

    eladmin的前端菜单支持动态路由,这意味着菜单可以根据用户的权限动态生成,提供个性化的界面展示,同时也优化了路由管理。 在数据字典方面,eladmin提供了对静态数据的管理功能,方便维护系统中的枚举类型或固定...

    基于Django+vue3的rbac权限和数据权限管理系统.zip

    【标题】"基于Django+vue3的rbac权限和数据权限管理系统" 是一个现代Web应用的实现,它结合了Python的Django框架与前端的Vue.js 3框架,用于构建一套完整的角色基础访问控制(Role-Based Access Control,RBAC)和...

    项目的权限设置,包括注释

    5. **管理权限**(Admin):拥有所有权限,可以进行系统配置和用户管理。 在实现权限控制时,有几种常见的策略: 1. **基于角色的访问控制**(Role-Based Access Control, RBAC):用户通过扮演角色获取权限,是最...

    springmvc+权限管理系统.

    Spring MVC 是一个基于 Java 的 Model-View-...通过以上技术的组合,"springmvc+权限管理系统" 实现了一个完整的、具备用户认证和授权功能的 Web 应用,能够有效地管理不同用户的访问权限,保证系统的安全性和稳定性。

    dubbo-admin-2.6.0 源码文件

    【标题】"dubbo-admin-2.6.0 源码文件" 是 Dubbo 项目中的一个组件,主要用于提供管理界面,帮助开发者监控和管理 Dubbo 服务。这个源码包包含了构建 dubbo-admin.war 文件所需的所有 Java 代码。 【描述】提到的 ...

    通过过滤器管理用户权限(1)

    在标题提到的"通过过滤器管理用户权限(1)"中,我们将主要关注如何利用过滤器实现登录验证,确保只有已登录的用户才能访问特定的受保护资源。这通常涉及到一个名为`LoginFilter`的类,正如压缩包中的`LoginFilter....

    Python库 | django_object_tools-0.0.2-py2.7.egg

    "django_object_tools"是一个专门设计用于Django后台管理界面(Admin Site)的扩展库,它为Django的模型对象提供了额外的管理工具。这个库的版本号为0.0.2,适用于Python 2.7版本,通过.egg格式的包分发,使得安装和...

    JAVA实现权限管理的两种方式六编程资料

    ### JAVA实现权限管理的两种方式 #### 第一种方式:利用Filter、XML文件和用户信息表配合使用来实现权限管理 在Java Web应用中,权限管理是确保系统安全性和功能访问控制的重要组成部分。本文将详细介绍如何通过...

    LYZJ.HM3Shop完整版权限管理系统.zip

    LYZJ.HM3Shop是一个基于ASP.NET MVC、Entity Framework(EF)框架和EasyUI的权限管理系统完整版。这个系统的核心目标是实现对用户权限的精细控制,为用户提供安全、高效的业务操作环境。以下是该系统涉及到的主要...

    thinkphp权限管理源码以及数据表

    - 菜单管理表(admin_menu):存储系统中各个功能模块的菜单信息,权限设置时可能需要用到此表中的数据。 6. 控制器与视图(Controller and View): 在thinkPHP框架中,控制器(Controller)负责处理用户的输入...

    businessObject_admin_guide.pdf

    《BusinessObjects Enterprise XI 3.1 管理员指南》深入解读 一、概览:BusinessObjects Enterprise XI 3.1 BusinessObjects Enterprise XI 3.1 是一款由SAP公司开发的企业级商业智能(BI)解决方案。该版本不仅...

    网站文件管理器asp

    在ASP应用中,"admin"通常用来存放与系统管理相关的页面和脚本,如管理员登录界面、权限设置、系统设置等。 知识点详解: 1. ASP基础:了解ASP的工作原理、语法结构以及如何在服务器上运行ASP脚本,这包括VBScript...

    医院管理系统前台mvc+dao实现

    综上所述,医院管理系统的前台MVC+DAO实现涉及到了数据模型的设计、前端页面的构建以及数据库访问的封装。通过合理划分职责,确保了系统的模块化和可扩展性,从而提升了系统的整体性能和用户体验。在实际开发过程中...

    C#母板页权限

    在“C#母板页权限”这个主题中,我们主要关注如何在母板页上实现对页面控件的访问和控制,以及如何实现基于用户权限的界面动态展示。以下是一些核心知识点: 1. **母板页结构**:母板页定义了整个网站的公共元素,...

    react-admin_client.rar

    React Admin是一个流行的开源框架,用于构建管理界面,而Ant Design则是一个广泛使用的React UI组件库。两者结合可以为开发者提供一套强大的工具来快速开发高效且美观的后台管理系统。 React Admin是一个基于React...

    CRM 权限控制---转载。

    10. **管理员权限(Admin Privileges)**:用于管理和监控其他用户权限。 #### 三、视图(View)和权限控制 在Siebel中,视图(View)是呈现给用户的界面,它决定了用户可以看到的数据范围。通过不同的视图设置,可以...

    LdapAdmin.zip_LDAPAdmin_active direct_delphi_开源

    标题中的“LdapAdmin.zip_LDAPAdmin_active direct_delphi_开源”揭示了这是一个关于使用Delphi编程语言开发的开源LDAP(轻量级目录访问协议)管理工具,名为LdapAdmin。这个工具主要用于管理和操作Active Directory...

    使用asp.net实现简单登录界面+网页简单布局

    通过学习和理解这些基础知识,你可以逐步构建出更复杂的Web应用程序,包括与数据库的深度交互、用户权限管理等高级功能。不过,一定要记住,安全性是任何登录系统的基石,因此在实际开发中应确保密码加密存储,并...

    Spring Security 3.0 权限管理

    例如,`hasRole('ROLE_ADMIN')`检查用户是否拥有管理员角色,`@permission.isOwner(object)`则可以检查用户是否是对象的所有者。 五、实际应用 在实际应用中,Spring Security可用来保护RESTful API、Web页面、...

Global site tag (gtag.js) - Google Analytics