自定义组件的权限
Posted yb635238477
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义组件的权限相关的知识,希望对你有一定的参考价值。
我们的组件已经写完了,但是当我们的其他项目要用到这个组件的时候,就需要把这个组件整个拿过去,所以我们应该把templates和stark放在一起。
直接将templates拖到stark组件下。
这样做也是可以的,不会报错,是因为settings中的templates的配置。
django查找模板文件顺序
(1) 先按照settings中配置的templates的DIR的指定路径查找
(2) 如果找不到,继续按settings中的app注册顺讯一次查找,每一个app下的templates文件,如果再找不到,报错
然后我们来了解一下什么是权限,当我们用url访问权限的时候,就可以把url当成是权限,只要有这个url就有权限。
rbac (role based access control)。
我们另起一个项目叫做crm,在则各项目中,我们要用到自己写的组件。我们直接拷贝过来stark组件。
我们要写权限,权限的所有功能,我们也可以放在一个app下,新建一个app,叫rbac,写我们的权限。
在rbac中我们要建一些用户权限的表。在rbac中的model中创建这几张表。先把rbac的app添加进setting中
from django.db import models # Create your models here. class User(models.Model): user=models.CharField(max_length=32) pwd=models.CharField(max_length=32) roles=models.ManyToManyField("Role") def __str__(self): return self.user class Role(models.Model): title=models.CharField(max_length=32) permissions=models.ManyToManyField("Permission") def __str__(self): return self.title class Permission(models.Model): url=models.CharField(max_length=128) title = models.CharField(max_length=32) code=models.CharField(max_length=32,default="list") def __str__(self): return self.title
然后执行数据库迁移的两条命令。配好url后,url(r‘^stark/‘, sites.site.urls), 就能够访问stark了。
我们先要理解清楚这几个app的功能,rbac是用来写权限的,而app01是用来写功能的,stark是我们写的组建。
这时候我们在app01下简单见几张表,加入几条数据(利用sark组件进行添加)。
app01下的model
from django.db import models # Create your models here. class School(models.Model): title = models.CharField(max_length=128) def __str__(self): return self.title class Order(models.Model): title = models.CharField(max_length=32) num = models.IntegerField(max_length=32) def __str__(self): return self.title
这样我们就能用stark组件对app01下的这几张表进行增删改查了。
这时候就涉及到权限问题了。因为有些角色不是拥有所有的功能,这时候就需要我们写权限了。
我们先把用户访问的url添加到rbac中,录入权限
但是我们在录入编辑和删除权限url的时候应该使用正则来匹配,因为当用户 拥有 访问 编辑学校的权限,而在写权限的时候不能把学校的id写死。
这样权限就简单的写完了,然后给rbac添加角色。
这时候角色和对应的权限都添加好了。
然后添加user用户
接下来就是用户登录后获取用户登录人的权限了。
用户登录属于业务逻辑,所以就在app01下的views中写。
这样用户登录之后,就可以进入stark组件访问了,但是这不是我们想要的,因为现在可以访问所有的权限,
接下来就是做一些用户的控制权限了。那这个怎么做呢?我们可以在用户访问的时候进行判断一下,如果这个用户的角色有这个url,就说明有权限访问。否则就没有权限访问。
那我们就想一想,这些代码应该写在哪?是不是每次用户登录之后就应该session中有没有权限的url,所以我们应该把他放在中间件中。
在rbac建一个package,在里面建一个py文件,用来写我们的中间件。
记住要在setting中 MIDDLEWARE 加上咱们的中间件 ‘rbac.service.rbac_middle.PermissionMiddleware‘,
但这时候会报一个错误,
这是为什么呢?因为我们没有登陆,所以当我们访问权限的时候会先走中间件,走到中间件就会重定向/login/,这又是一次请求,又会走中间件,这样一直循环。
所以我们在中间件中设置一个白名单:
判断当前的路径是否在白名单内,如果在就放行,如果不在就重定向到login页面。 这样用户登录的认证就做好了
接下来就是权限认证了
之前我们不是把登陆人的权限url存在session中了吗?
这样似乎就写完了。但是,但我们访问编辑和删除的权限的时候却不能访问了,
因为在我们访问的编辑和删除权限的时候:
我们应该用正则:
还有一个小问题,就是但我们访问admin的时候,如果没有登陆admin会自动跳转到/admin/login/?next=/admin/但是,这时候走中间件就会被拦截下来,所以:
这时候访问admin就能够看到了。
这样权限访问就可以了。
接下来就是权限菜单的显示。就是在左侧显示一个当前登陆人的权限菜单
在页面中渲染:
以上是关于自定义组件的权限的主要内容,如果未能解决你的问题,请参考以下文章