一、背景
为了满足业务需求,需要保证archery不能自提自审,当然,这样做也是一种更安全的做法,简单的阅读下源码,有了个大体的思路,话不多说,直接上代码
二、修改部分
vi /opt/archery/sql/utils/workflow_audit.py
三、解释
这里可以看到改动的部分比较简单
can_review方法为当前审核人能不能审核工单,result为true的话则表示可以审核,所以这里面只需要把user为create_user的用户去掉就好
相关代码
Archery/sql/utils/resource_group.py
def auth_group_users(auth_group_names, group_id):
"""
获取资源组内关联指定权限组的用户
:param auth_group_names: 权限组名称list
:param group_id: 资源组ID
:return:
"""
# 获取资源组关联的用户
# users_set 即表名后接_set是指反向查询,查询users表中的
# resource_group = models.ManyToManyField(ResourceGroup, verbose_name='资源组', blank=True) 查对应的users表的信息
# 个人觉得相当于的查询是 select * from sql_users where id in ( select users_id from sql_users_resource_group where resourcegroup_id=group_id);
users = ResourceGroup.objects.get(group_id=group_id).users_set.all()
# 过滤在该权限组中的用户
# 字段后面接__in代表的是in查询
# select * from sql_users where id in (select users_id from sql_users_groups where group_id=7);
users = users.filter(groups__name__in=auth_group_names)
return users
# models.py
class Users(AbstractUser):
"""
用户信息扩展
"""
display = models.CharField('显示的中文名', max_length=50, default='')
ding_user_id = models.CharField('钉钉UserID', max_length=64, blank=True)
wx_user_id = models.CharField('企业微信UserID', max_length=64, blank=True)
feishu_open_id = models.CharField('飞书OpenID', max_length=64, blank=True)
failed_login_count = models.IntegerField('失败计数', default=0)
last_login_failed_at = models.DateTimeField('上次失败登录时间', blank=True, null=True)
# 反向查询关联字段
resource_group = models.ManyToManyField(ResourceGroup, verbose_name='资源组', blank=True)
def save(self, *args, **kwargs):
self.failed_login_count = min(127, self.failed_login_count)
self.failed_login_count = max(0, self.failed_login_count)
super(Users, self).save(*args, **kwargs)
def __str__(self):
if self.display:
return self.display
return self.username
class Meta:
managed = True
db_table = 'sql_users'
verbose_name = u'用户管理'
verbose_name_plural = u'用户管理'