自动化工具 新潮测试平台之权限和角色实现

新潮质量保障 for 新潮测试技术 · 2020年01月19日 · 1490 次阅读

该文原创为新潮质量保障技术团队中的 “上进的中年软件测试从业者”,用于技术交流分享

又是充实的一天,早上 8:15 到公司参加培训,10:30 骑着共享单车到酒店参加 PMP 的面授。刚刚又回到公司总结面授课程及注意事项发给组内,现在正在写这篇文章,等下要去参加每周六晚上的篮球活动。年轻的时候和很多人一样讨厌被支配,对各种安排及其的不耐烦,现在很满足充实的状态,不是因为成熟了,是因为华为提出的 35 岁的槛。欠的债迟早是要还的,借鉴老师说的话,你去品,你细品。。。
上一篇我们介绍了登录的实现,这一次我们将介绍权限和角色的实现。我们都知道,在任务系统里面,都应该对菜单级,子菜单级,甚至接口层面做权限控制,这样能更好的规划系统的功能区域和系统的复用率。

权限,角色和用户的关系

很多人一遇到权限和角色就蒙,好不容易理清了,过段时间遇到了又要重新理解一次。这里给一个简单的理解办法,在家里有管钱、管卡、管房产证、做饭、吃饭、洗碗、睡觉等事情;我们把做饭和洗碗归并到后勤保障,把其他的归并到家庭管理,把吃饭和睡觉归并到生活必须。你可以拥有后勤保障和生活必须的权利,你老婆可以拥有家庭管理和生活必须的权利。这样应该好理解吧。

测试平台功能实现

感谢 flask_admin 提供的 ModelView 支持is_accessible方法,感谢 flask_login 支持的current_user属性,让这一切变得非常容易。我们需要做的就是设计权限和角色。上面我们讲到角色、权限和用户的关系,那我们直接就把角色、权限以及我们的测试人员表根据对应的关系创建好就行了。

权限表

class PermissionForm(Document):
    permissionType = StringField(db_field="permissionType", validators=[DataRequired(message=u"权限类型不能为空")],
                                 )
    permissionDescription = StringField(db_field="permissionDescription",
                                        validators=[DataRequired(message=u"权限描述不能为空")])
    meta = {
        "collection": "Dictionary"
    }

    @queryset_manager
    def objects(doc_cls, queryset):
        return queryset.filter(permissionType__exists=True)

    def __unicode__(self):  # 解决对象引用过程中,前端看到的是可视化的名字,而不是对象名称。
        return self.permissionType

角色表

class RuleForm(Document):
    ruleType = StringField(db_field="ruleType", validators=[DataRequired(message=u"角色类型不能为空")],
                           )
    permissions = ListField(ReferenceField(PermissionForm))
    ruleDescription = StringField(db_field="ruleDescription",
                                  validators=[DataRequired(message=u"角色描述不能为空")])
    meta = {
        "collection": "Dictionary"
    }

在角色表的第四行,我们定义了对应关系,一个角色可以拥有多个权限。

用户表

class TesterForm(Document):
    testerName = StringField(db_field="testerName", validators=[DataRequired(message=u"姓名不能为空")])
    testerId = StringField(db_field="testerId", validators=[DataRequired(message=u"域账号ID不能为空")])
    testerDepartment = StringField(db_field="testerDepartment")
    gitId = ListField(StringField(db_field="gitId"))
    rule = ReferenceField(RuleForm)
    meta = {
        "collection": "tester"
    }

    def __unicode__(self):  # 解决对象引用过程中,前端看到的是可视化的名字,而不是对象名称。
        return self.testerName + "(%s)" % self.testerDepartment

在用户表的第六行定义了用户和角色的关系。

权限如何控制菜单?

  • 重写 ModelView, 多增加一个权限参数。

  • 创建视图的时候,传入你想让这个菜单被控制的程度

最终,菜单可以通过权限进行控制了,是不是很简单,你也可以的。感谢大家的耐心阅读,下一次将介绍人员管理和项目管理的实现,再见!

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册