加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

权限管理系统

发布时间:2020-12-15 17:19:41 所属栏目:大数据 来源:网络整理
导读:一、需求分析: 用户登录 - 获取当前用户具有的所有角色 - 获取当前用户具有的所有权限(去重) -在访问列表页面时,需要判断:有无添加权限,有无删除权限,有无编辑权限;在页面上显示相应权限按钮 -访问菜单URL时,默认展开其所属菜单 -访问非菜单URL,默

一、需求分析:

用户登录
- 获取当前用户具有的所有角色
- 获取当前用户具有的所有权限(去重)

  -在访问列表页面时,需要判断:有无添加权限,有无删除权限,有无编辑权限;在页面上显示相应权限按钮

  -访问菜单URL时,默认展开其所属菜单

  -访问非菜单URL,默认选中原菜单

二、方法步骤

a.首先建一个名为rbac的APP

b.创建表结构,基于角色权限控制、菜单:

  -5个类,7张表


<div class="cnblogs_code" onclick="cnblogs_code_show('23b3937b-2e92-439b-acbb-886dba1573d5')">


<div id="cnblogs_code_open_23b3937b-2e92-439b-acbb-886dba1573d5" class="cnblogs_code_hide">

 django.db <span style="color: #0000ff;">class<span style="color: #000000;"> Menu(models.Model):
<span style="color: #800000;">"""<span style="color: #800000;">
菜单组
<span style="color: #800000;">"""<span style="color: #000000;">
title = models.CharField(max_length=32<span style="color: #000000;">)

</span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta:
    verbose_name_plural </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;菜单组</span><span style="color: #800000;"&gt;"</span>

<span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self):
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; self.title

<span style="color: #0000ff;">class<span style="color: #000000;"> Group(models.Model):
<span style="color: #800000;">"""<span style="color: #800000;">
权限组
<span style="color: #800000;">"""<span style="color: #000000;">
caption = models.CharField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">组名称<span style="color: #800000;">',max_length=16<span style="color: #000000;">)
menu = models.ForeignKey(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">所属菜单<span style="color: #800000;">',to=<span style="color: #800000;">'<span style="color: #800000;">Menu<span style="color: #800000;">',default=1<span style="color: #000000;">)

</span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta:
    verbose_name_plural </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;权限组</span><span style="color: #800000;"&gt;"</span>

<span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self):
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; self.caption

<span style="color: #0000ff;">class<span style="color: #000000;"> Permission(models.Model):
<span style="color: #800000;">"""<span style="color: #800000;">
权限表
<span style="color: #800000;">"""<span style="color: #000000;">
title = models.CharField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">标题<span style="color: #800000;">',max_length=32<span style="color: #000000;">)
url = models.CharField(verbose_name=<span style="color: #800000;">"<span style="color: #800000;">含正则URL<span style="color: #800000;">",max_length=64<span style="color: #000000;">)

menu_gp </span>= models.ForeignKey(verbose_name=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;组内菜单</span><span style="color: #800000;"&gt;'</span>,to=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;Permission</span><span style="color: #800000;"&gt;'</span>,null=True,blank=True,related_name=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;x1</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)

code </span>= models.CharField(verbose_name=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;操作</span><span style="color: #800000;"&gt;"</span>,max_length=16<span style="color: #000000;"&gt;)
group </span>= models.ForeignKey(verbose_name=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;所属组</span><span style="color: #800000;"&gt;'</span>,to=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Group</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)

</span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta:
    verbose_name_plural </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;权限表</span><span style="color: #800000;"&gt;"</span>

<span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self):
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; self.title

<span style="color: #0000ff;">class<span style="color: #000000;"> User(models.Model):
<span style="color: #800000;">"""<span style="color: #800000;">
用户表
<span style="color: #800000;">"""<span style="color: #000000;">
username = models.CharField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">用户名<span style="color: #800000;">',max_length=32<span style="color: #000000;">)
password = models.CharField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">密码<span style="color: #800000;">',max_length=64<span style="color: #000000;">)
email = models.CharField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">邮箱<span style="color: #800000;">',max_length=32<span style="color: #000000;">)

roles </span>= models.ManyToManyField(verbose_name=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;具有的所有角色</span><span style="color: #800000;"&gt;'</span>,to=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Role</span><span style="color: #800000;"&gt;"</span>,blank=<span style="color: #000000;"&gt;True)

</span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta:
    verbose_name_plural </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;用户表</span><span style="color: #800000;"&gt;"</span>

<span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self):
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; self.username

<span style="color: #0000ff;">class<span style="color: #000000;"> Role(models.Model):
<span style="color: #800000;">"""<span style="color: #800000;">
角色表
<span style="color: #800000;">"""<span style="color: #000000;">
title = models.CharField(max_length=32<span style="color: #000000;">)
permissions = models.ManyToManyField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">具有的所有权限<span style="color: #800000;">',blank=<span style="color: #000000;">True)

</span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta:
    verbose_name_plural </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;角色表</span><span style="color: #800000;"&gt;"</span>

<span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self):
    </span><span style="color: #0000ff;"&gt;return</span> self.title</pre>
verbose_name---在admin模式下,字段显示的名字
blank=True  ---在admin模式下,字段可以为空
class Meta:
verbose_name_plural = "表名"  ---在admin模式下,显示的表名

<div class="cnblogs_code" onclick="cnblogs_code_show('c58cc8ef-20a7-480c-908a-a4ec23395d08')">


<div id="cnblogs_code_open_c58cc8ef-20a7-480c-908a-a4ec23395d08" class="cnblogs_code_hide">

 django.contrib <span style="color: #0000ff;">from . <span style="color: #0000ff;">import<span style="color: #000000;"> models

admin.site.register(models.Permission)
admin.site.register(models.User)
admin.site.register(models.Role)
admin.site.register(models.Group)
admin.site.register(models.Menu)

c.基于Django admin录入权限数据

  python manage.py createsuperuser

d.用户登录程序

  按照逻辑,当我们输入一个URL,在跳转到相应页面前,我们需要做3件事:

  

,拿到用户权限信息

,如能访问此URL,当进入URL后,我们还需要根据用户的身份,在页面上显示不同的操作权限

由于每次跳转一个URL前,都会重复上面的步骤,,以免为此给每个视图函数都加上一个装饰器(麻烦)

比对账户密码,设置session的过程应该是在视图函数里完成,

首先,我们来考虑一下,作为权限管理系统,我们希望能根据用户的权限,在页面显示一些相应菜单信息和操作按钮,所以session设置,我们分两个部分:

一个是权限相关,用来检验用户访问权限,以及页面权限相关按钮(添加、编辑、删除)显示与否

二是菜单相关,比如我们点击菜单一里的子选项:用户列表,显示页面信息后,菜单一仍然是展开状态,当我们在用户列表点击添加用户,跳转新页面时,仍然展开菜单一

session权限相关

根据需求,我们知道,权限相关里,我们需要拿到、和

为了方便后取数据,所以我们最终想要的结构是

{group_id1:{

  urls:[url1、url2、url3....],

  codes:[list、del、edit、add]},

group_id2:{

  urls:[url1、url2、url3....],

  codes:[list、del、edit、add]}

session菜单相关

根据需求,我们知道,权限相关里,我们需要

list = user.roles.values(, , , , , , , ,

一定要去重,因为有的人有几个身份,有的权限会重复,将上面拿到的数据,再处理一下,分别作为,菜单相关,权限相关所需的数据


django.conf <span style="color: #0000ff;">def<span style="color: #000000;"> init_permission(user,request):
<span style="color: #800000;">"""<span style="color: #800000;">
初始化权限信息,获取权限信息并放置到session中。
<span style="color: #800000;">"""<span style="color: #000000;">
permission_list = user.roles.values(<span style="color: #800000;">'<span style="color: #800000;">permissionsid<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">permissionstitle<span style="color: #800000;">',<span style="color: #008000;">#<span style="color: #008000;"> 用户列表
<span style="color: #800000;">'<span style="color: #800000;">permissionsurl<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">permissionscode<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">permissionsmenu_gp_id<span style="color: #800000;">',<span style="color: #008000;">#<span style="color: #008000;"> 组内菜单ID,Null表示是菜单
<span style="color: #800000;">'<span style="color: #800000;">permissions
group_id<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">permissionsgroupmenu_id<span style="color: #800000;">',<span style="color: #008000;">#<span style="color: #008000;"> 菜单ID
<span style="color: #800000;">'<span style="color: #800000;">permissionsgroupmenu__title<span style="color: #800000;">',<span style="color: #008000;">#<span style="color: #008000;"> 菜单名称
).distinct() <span style="color: #008000;">#<span style="color: #008000;">要去重,因为每个人可能有多种身份,权限会重复

<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 菜单相关(以后再匹配)</span>
sub_permission_list =<span style="color: #000000;"&gt; []
</span><span style="color: #0000ff;"&gt;for</span> item <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; permission_list:
    tpl </span>=<span style="color: #000000;"&gt; {
        </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;id</span><span style="color: #800000;"&gt;'</span>:item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;permissions__id</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;],</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;title</span><span style="color: #800000;"&gt;'</span>:item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;permissions__title</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;],</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;url</span><span style="color: #800000;"&gt;'</span>:item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;permissions__url</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;],</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;menu_gp_id</span><span style="color: #800000;"&gt;'</span>:item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;permissions__menu_gp_id</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;],</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;menu_id</span><span style="color: #800000;"&gt;'</span>:item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;permissions__group__menu_id</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;],</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;menu_title</span><span style="color: #800000;"&gt;'</span>:item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;permissions__group__menu__title</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;],}
    sub_permission_list.append(tpl)
request.session[settings.PERMISSION_MENU_KEY] </span>=<span style="color: #000000;"&gt; sub_permission_list


</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 权限相关</span>
result =<span style="color: #000000;"&gt; {}
</span><span style="color: #0000ff;"&gt;for</span> item <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt;  permission_list:
    group_id </span>= item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;permissions__group_id</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]
    code </span>= item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;permissions__code</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]
    url </span>= item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;permissions__url</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]
    </span><span style="color: #0000ff;"&gt;if</span> group_id <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; result:
        result[group_id][</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;codes</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;].append(code)
        result[group_id][</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;urls</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;].append(url)
    </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;:
        result[group_id] </span>=<span style="color: #000000;"&gt; {
            </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;codes</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;:[code,],</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;urls</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;:[url,]
        }

request.session[settings.PERMISSION_URL_DICT_KEY] </span>= result</pre>

init_permission(user,request)

from rbac.service.init_permission import init_permission

在rbac中建立一个middlewares文件夹,然后建一个名为rbac.py的文件,用来编写我们自定义的中间件代码

<span style="color: #0000ff;">from django.shortcuts <span style="color: #0000ff;">import<span style="color: #000000;"> redirect,HttpResponse
<span style="color: #0000ff;">from django.conf <span style="color: #0000ff;">import<span style="color: #000000;"> settings

<span style="color: #0000ff;">class<span style="color: #000000;"> MiddlewareMixin(object):
<span style="color: #0000ff;">def <span style="color: #800080;">init(self,get_response=<span style="color: #000000;">None):
self.get_response =<span style="color: #000000;"> get_response
super(MiddlewareMixin,self).<span style="color: #800080;">init<span style="color: #000000;">()

</span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__call__</span><span style="color: #000000;"&gt;(self,request):
    response </span>=<span style="color: #000000;"&gt; None
    </span><span style="color: #0000ff;"&gt;if</span> hasattr(self,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;process_request</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;):
        response </span>=<span style="color: #000000;"&gt; self.process_request(request)
    </span><span style="color: #0000ff;"&gt;if</span> <span style="color: #0000ff;"&gt;not</span><span style="color: #000000;"&gt; response:
        response </span>=<span style="color: #000000;"&gt; self.get_response(request)
    </span><span style="color: #0000ff;"&gt;if</span> hasattr(self,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;process_response</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;):
        response </span>=<span style="color: #000000;"&gt; self.process_response(request,response)
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; response

<span style="color: #0000ff;">class<span style="color: #000000;"> RbacMiddleware(MiddlewareMixin):

</span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; process_request(self,request):
    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 1. 获取当前请求的URL</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; request.path_info</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 2. 获取Session中保存当前用户的权限</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; request.session.get("permission_url_list')</span>
    current_url =<span style="color: #000000;"&gt; request.path_info

    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 当前请求不需要执行权限验证</span>
    <span style="color: #0000ff;"&gt;for</span> url <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; settings.VALID_URL:
        </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; re.match(url,current_url):
            </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; None

    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;在视图函数那边验证用户登录成功后,会设置session,如果登录成功则会有此session</span>
    permission_dict =<span style="color: #000000;"&gt; request.session.get(settings.PERMISSION_URL_DICT_KEY)
    </span><span style="color: #0000ff;"&gt;if</span> <span style="color: #0000ff;"&gt;not</span><span style="color: #000000;"&gt; permission_dict:
        </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;没有session值,则说明没有登录,需要跳转登录页面</span>
        <span style="color: #0000ff;"&gt;return</span> redirect(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;/login/</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)

    flag </span>=<span style="color: #000000;"&gt; False
    </span><span style="color: #0000ff;"&gt;for</span> group_id,code_url <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; permission_dict.items():

        </span><span style="color: #0000ff;"&gt;for</span> db_url <span style="color: #0000ff;"&gt;in</span> code_url[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;urls</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]:
            regax </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;^{0}$</span><span style="color: #800000;"&gt;"</span>.format(db_url)  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;为了精准匹配</span>
            <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 将当前页面与当前用户可访问的页面进行匹配</span>
            <span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; re.match(regax,current_url):
                </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;匹配成功后将用户的可执行的(增、删、改、列表等操作)存到request中,方便调用</span>
                request.permission_code_list = code_url[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;codes</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]
                flag </span>=<span style="color: #000000;"&gt; True
                </span><span style="color: #0000ff;"&gt;break</span>

        <span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; flag:
            </span><span style="color: #0000ff;"&gt;break</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;匹配失败,则显示无权访问</span>
    <span style="color: #0000ff;"&gt;if</span> <span style="color: #0000ff;"&gt;not</span><span style="color: #000000;"&gt; flag:
        </span><span style="color: #0000ff;"&gt;return</span> HttpResponse(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;无权访问</span><span style="color: #800000;"&gt;'</span>)</pre>

PERMISSION_URL_DICT_KEY =

还有加上URL白名单

VALID_URL =

由于页面上都会显示菜单,所以我们先写一个模板,其他的只有继承就好

{% load rbac %} { > > content=> content=> href= /> Title
>% menu_html request %} {
>% block content %}{% endblock %
        <script src=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;/static/jquery-3.2.1.min.js</span><span style="color: #800000;"&gt;"</span>></script>
        <script src=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;/static/rbac/rbac.js</span><span style="color: #800000;"&gt;"</span>></script>

在rbac下建立一个static再在里面建立rbac文件夹,在建我们的css和js文件

.item---

/** * Created by Administrator on 2017/11/8*/($(this).next().hasClass(});

jquery文件我们可以放在根目录下的static文件夹中

接下来我们写自定义标签的内容在rbac下建立templatetags文件下,创建rbac.py

django.template django.conf =@register.inclusion_tag(<span style="color: #800000;">"<span style="color: #800000;">xxxxx.html<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">def
<span style="color: #000000;"> menu_html(request):
<span style="color: #800000;">"""
<span style="color: #800000;">
去Session中获取菜单相关信息,匹配当前URL,生成菜单
:param request:
:return:
<span style="color: #800000;">"""<span style="color: #000000;">
menu_list =<span style="color: #000000;"> request.session[settings.PERMISSION_MENU_KEY]
current_url =<span style="color: #000000;"> request.path_info

menu_dict </span>=<span style="color: #000000;"&gt; {}
</span><span style="color: #0000ff;"&gt;for</span> item <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; menu_list:
    </span><span style="color: #0000ff;"&gt;if</span> <span style="color: #0000ff;"&gt;not</span> item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;menu_gp_id</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]:
        menu_dict[item[</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;id</span><span style="color: #800000;"&gt;'</span>]] =<span style="color: #000000;"&gt; item

</span><span style="color: #0000ff;"&gt;for</span> item <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; menu_list:
    regex </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;^{0}$</span><span style="color: #800000;"&gt;"</span>.format(item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;url</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;])
    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; re.match(regex,current_url):
        menu_gp_id </span>= item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;menu_gp_id</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]
        </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; menu_gp_id:
            menu_dict[menu_gp_id][</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;active</span><span style="color: #800000;"&gt;'</span>] =<span style="color: #000000;"&gt; True
        </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;:
            menu_dict[item[</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;id</span><span style="color: #800000;"&gt;'</span>]][<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;active</span><span style="color: #800000;"&gt;'</span>] =<span style="color: #000000;"&gt; True

result </span>=<span style="color: #000000;"&gt; {}
</span><span style="color: #0000ff;"&gt;for</span> item <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; menu_dict.values():
    active </span>= item.get(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;active</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)
    menu_id </span>= item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;menu_id</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]
    </span><span style="color: #0000ff;"&gt;if</span> menu_id <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; result:
        result[menu_id][</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;children</span><span style="color: #800000;"&gt;'</span>].append({ <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;title</span><span style="color: #800000;"&gt;'</span>: item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;title</span><span style="color: #800000;"&gt;'</span>],<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;url</span><span style="color: #800000;"&gt;'</span>: item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;url</span><span style="color: #800000;"&gt;'</span>],<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;active</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;:active})
        </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; active:
            result[menu_id][</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;active</span><span style="color: #800000;"&gt;'</span>] =<span style="color: #000000;"&gt; True
    </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;:
        result[menu_id] </span>=<span style="color: #000000;"&gt; {
            </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;menu_id</span><span style="color: #800000;"&gt;'</span>:item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;menu_id</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;],</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;menu_title</span><span style="color: #800000;"&gt;'</span>:item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;menu_title</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;],</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;active</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;:active,</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;children</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;:[
                { </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;title</span><span style="color: #800000;"&gt;'</span>: item[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;title</span><span style="color: #800000;"&gt;'</span>],<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;active</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;:active}
            ]
        }

</span><span style="color: #0000ff;"&gt;return</span> {<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;menu_dict</span><span style="color: #800000;"&gt;'</span>:result}</pre>

menu_dict = item item[]] = item

item = .format(item[= item[ menu_dict[menu_gp_id][] = menu_dict[item[]][] = True

result = item = item.get(= item[ menu_id result[menu_id][].append({ : item[], result[menu_id][] ==:item[: item[],

作用是:可以将其所装饰的函数menu_html的返回值直接给xxxxx.html(此页面是用来生成菜单相关的html)中使用,

当调用自定义标签menu_html时,会将经过渲染后的xxxxx.html页面以字符串的形式返回给调用的地方

用来形成菜单

这样以后其他页面直接继承layout.html就会有其对应的菜单,内容部分,我们还需要判断一下用户的操作权限,以显示相应操作按钮,如userinfo页面

django.conf.urls django.contrib rbac app01 =

=</span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; has_add(self): </span><span style="color: #0000ff;"&gt;if</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;add</span><span style="color: #800000;"&gt;"</span> <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; self.code_list: </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; True </span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; has_edit(self): </span><span style="color: #0000ff;"&gt;if</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;edit</span><span style="color: #800000;"&gt;'</span> <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; self.code_list: </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; True </span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; has_del(self): </span><span style="color: #0000ff;"&gt;if</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;del</span><span style="color: #800000;"&gt;'</span> <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; self.code_list: </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; True

<span style="color: #0000ff;">def<span style="color: #000000;"> userinfo(request):
page_permission =<span style="color: #000000;"> BasePagePermission(request.permission_code_list)
data_list =<span style="color: #000000;"> [
{<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">':1,<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">xxx1<span style="color: #800000;">'<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">':2,<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">xxx2<span style="color: #800000;">'<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">':3,<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">xxx3<span style="color: #800000;">'<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">':4,<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">xxx4<span style="color: #800000;">'<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">':5,<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">xxx5<span style="color: #800000;">'<span style="color: #000000;">},]
<span style="color: #0000ff;">return render(request,<span style="color: #800000;">'<span style="color: #800000;">userinfo.html<span style="color: #800000;">',{<span style="color: #800000;">'<span style="color: #800000;">data_list<span style="color: #800000;">':data_list,<span style="color: #800000;">'<span style="color: #800000;">page_permission<span style="color: #800000;">'<span style="color: #000000;">:page_permission})

<span style="color: #0000ff;">def<span style="color: #000000;"> userinfo_add(request):
page_permission =<span style="color: #000000;"> BasePagePermission(request.permission_code_list)
<span style="color: #0000ff;">return render(request,<span style="color: #800000;">'<span style="color: #800000;">userinfo_add.html<span style="color: #800000;">',{ <span style="color: #800000;">'<span style="color: #800000;">page_permission<span style="color: #800000;">'<span style="color: #000000;">: page_permission})

<span style="color: #0000ff;">class<span style="color: #000000;"> OrderPagePermission(BasePagePermission):
<span style="color: #008000;">#<span style="color: #008000;">继承基础的,方便扩展
<span style="color: #0000ff;">def<span style="color: #000000;"> has_report(self):
<span style="color: #0000ff;">if <span style="color: #800000;">'<span style="color: #800000;">report<span style="color: #800000;">' <span style="color: #0000ff;">in<span style="color: #000000;"> self.code_list:
<span style="color: #0000ff;">return<span style="color: #000000;"> True

<span style="color: #0000ff;">def<span style="color: #000000;"> order(request):
order_permission =<span style="color: #000000;"> OrderPagePermission(request.permission_code_list)

</span><span style="color: #0000ff;"&gt;return</span> render(request,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;order.html</span><span style="color: #800000;"&gt;'</span>)</pre>

{% extends %{% block content %<span style="color: #000000;">}
{
% <span style="color: #0000ff;">if
page_permission.has_add %<span style="color: #000000;">}
<a href=<span style="color: #800000;">"<span style="color: #800000;">/userinfo/add/<span style="color: #800000;">">添加<span style="color: #000000;">
{% endif %<span style="color: #000000;">}
<table><span style="color: #000000;">
{% <span style="color: #0000ff;">for row <span style="color: #0000ff;">in data_list %<span style="color: #000000;">}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.name }}</td><span style="color: #000000;">
{% <span style="color: #0000ff;">if page_permission.has_edit %<span style="color: #000000;">}
<td><a href=<span style="color: #800000;">"<span style="color: #800000;">#<span style="color: #800000;">">编辑</td><span style="color: #000000;">
{% endif %<span style="color: #000000;">}
{% <span style="color: #0000ff;">if page_permission.has_del %<span style="color: #000000;">}
<td><a href=<span style="color: #800000;">"<span style="color: #800000;">#<span style="color: #800000;">">删除</td><span style="color: #000000;">
{% endif %<span style="color: #000000;">}
</tr><span style="color: #000000;">
{% endfor %<span style="color: #000000;">}

        </span></table&gt;<span style="color: #000000;"&gt;

{% endblock %}

三、总结

rbac里有什么?

settings中有什么?

INSTALLED_APPS =, <span style="color: #008000;">#<span style="color: #008000;">########加入我们自定义的中间件,使其生效########
MIDDLEWARE =<span style="color: #000000;"> [
<span style="color: #800000;">'
<span style="color: #800000;">rbac.middlewares.rbac.RbacMiddleware
<span style="color: #800000;">'
<span style="color: #000000;">,]

<span style="color: #008000;">#<span style="color: #008000;">############CSS,JS,JQ############
STATICFILES_DIRS =<span style="color: #000000;"> (
os.path.join(BASE_DIR,<span style="color: #800000;">'<span style="color: #800000;">static<span style="color: #800000;">'<span style="color: #000000;">),)

<span style="color: #008000;">#<span style="color: #008000;">#########Session中用到的变量#############
PERMISSION_URL_DICT_KEY = <span style="color: #800000;">"<span style="color: #800000;">permission_url_dict<span style="color: #800000;">"<span style="color: #000000;">
PERMISSION_MENU_KEY = <span style="color: #800000;">"<span style="color: #800000;">permission_menu_key<span style="color: #800000;">"

<span style="color: #008000;">#<span style="color: #008000;">####白名单############
<span style="color: #000000;">
VALID_URL =<span style="color: #000000;"> [
<span style="color: #800000;">"<span style="color: #800000;">/login/<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">/admin.*<span style="color: #800000;">"<span style="color: #000000;">
]

使用方法

1.创建project

2.复制rbac文件

3.在settings中按上面的设置

4.去admin中配置文件,录入权限信息

5.在登陆逻辑中,登陆成功时,调用init_permission方法(为此要在视图函数中导入

from rbac import models
from rbac.service.init_permission import init_permission

6.视图函数中用来判断是否具有code操作

<span style="color: #0000ff;">class<span style="color: #000000;"> OrderPagePermission(BasePagePermission):
<span style="color: #008000;">#
<span style="color: #008000;">继承基础的,方便扩展

<span style="color: #0000ff;">def
<span style="color: #000000;"> has_report(self):
<span style="color: #0000ff;">if
<span style="color: #800000;">'
<span style="color: #800000;">report
<span style="color: #800000;">' <span style="color: #0000ff;">in<span style="color: #000000;"> self.code_list:
<span style="color: #0000ff;">return<span style="color: #000000;"> True

<span style="color: #0000ff;">def<span style="color: #000000;"> order(request):
order_permission =<span style="color: #000000;"> OrderPagePermission(request.permission_code_list)

</span><span style="color: #0000ff;"&gt;return</span> render(request,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;order.html</span><span style="color: #800000;"&gt;'</span>)</pre>

前端页面只需要

{% if page_permission.has_add %}
    
{% endif %}



7. 模板中:
{%load rbac %} 加载自定义标签

  引用rbac中的CSS



{% menu_html request%} 调用自定义menu_html标签,并传入request参数

  引用rbac中的JS



(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读