• 自定义组件之crm的权限


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

    这样权限访问就可以了。

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

     

    在页面中渲染:

  • 相关阅读:
    毕设随笔 ssm框架搭建
    ubuntu18.04安装mysql与workbench
    Ubuntu18.04安装破解Intellij IDEA
    快慢指针--快乐数判断
    二维数组,深度优先算法 -- 岛屿数量
    动态规划--打家劫舍
    大数据课程笔记 1
    递归--上下翻转二叉树
    python课程设计笔记(五) ----Resuests+BeautifulSoup (爬虫入门)
    Git Learning Part III
  • 原文地址:https://www.cnblogs.com/yb635238477/p/9588815.html
Copyright © 2020-2023  润新知