0

我有允许三种类型用户访问管理界面的情况: - 管理员 - 主管 - 代理

这是一种情况层次结构,管理员是一个(超级用户),它创建了主管,主管创建了代理。

他们都可以使用不同的授权登录到 django admin。

登录由 'django.contrib.auth' 管理,默认模型 auth_user (.

     from django.contrib.auth.models import User

class Supervisor(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    e_mail = models.EmailField(max_length=60, db_column='E-Mail',blank=True)
   ...other fields....


class Admin(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    e_mail = models.EmailField(max_length=60, db_column='E-Mail',blank=True)
     ...other fields...

但有个问题。如果我允许主管创建代理,则意味着我必须添加授权以添加和更改表 USER。这很危险,任何主管都可能成为超级用户,删除用户等等......

我该如何解决这个问题?是否有可能允许主管创建一个代理,而不会使他变得危险?

谢谢


编辑

我有一个疑问......在models.py的定义类期间我写了这个方法:

def save(self):
    self.user.is_staff = True
    self.user.save()
    super(Agent, self).save()

在 Java 中,EJB 的方法是事务/原子的(提交是自动的)......在 django 中,我必须调用方法 save()。

这是一个和之前不同的问题......

4

1 回答 1

0

不知道我是否明白你的问题。但是,如果我这样做了,您可以编辑用户创建表单。

@admin.register(User)
class UserAdmin(BaseUserAdmin):
    view_on_site = False
    list_display = ('username', 'first_name', 'last_name', 'is_active', 'is_staff', 'date_joined', 'last_login')
    list_filter = ('is_staff', )
    fieldsets = (
        ('Data', {'fields': ('username', 'email', 'first_name', 'last_name', 'password')}),
        ('Activation/Deactivation', {'fields': ('is_active', )}),
        ('Permissions', {'fields': ('is_staff', 'groups', )})
)

由于superuser不再是一种选择,您的主管不能成为超级用户。

让我知道这是否有帮助。也许我们可以更接近解决方案。

于 2018-09-20T01:55:15.160 回答