该文原创为新潮质量保障技术团队中的 “上进的中年软件测试从业者”,用于技术交流分享
又是充实的一天,早上 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, 多增加一个权限参数。
创建视图的时候,传入你想让这个菜单被控制的程度
最终,菜单可以通过权限进行控制了,是不是很简单,你也可以的。感谢大家的耐心阅读,下一次将介绍人员管理和项目管理的实现,再见!