自定义组件的权限

我们的组件已经写完了,但是当我们的其他项目要用到这个组件的时候,就需要把这个组件整个拿过去,所以我们应该把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就能够看到了。

这样权限访问就可以了。

接下来就是权限菜单的显示。就是在左侧显示一个当前登陆人的权限菜单

 

在页面中渲染:

猜你喜欢

转载自www.cnblogs.com/yb635238477/p/9588815.html