前言:
一.用户角色权限设计思路:
<1>不同职责的人员,对于系统操作的权限应该是不同;
<2>可以对“组”进行权限分配;
<3>权限管理系统应该是可扩展的;
<4>满足业务系统中的功能权限
2. 角色和操作的权限设计(
不同的应用场合,你可能会想出不同的需求,提了一个新的需求以后,可能会发现原来的设计没方法实现了,于是还要添加一个新的表。这也是上面所提到的问题。 其实不必想得那么复杂,权限可以简单描述为:
某某主体 在 某某领域 有 某某权限
1,主体可以是用户,可以是角色,也可以是一个部门
2, 领域可以是一个模块,可以是一个页面,也可以是页面上的按钮
3, 权限可以是“可见”,可以是“只读”,也可以是“可用”(如按钮可以点击)
其实就是Who、What、How的问题, 谁对什么功能,动作有怎样的操作权限
下面来看看表结构是如何设计的,代码如下:
from django.db import models
# Create your models here.
class Permission(models.Model):
caption = models.CharField(max_length=32)
parent_id = models.ForeignKey('Permission', related_name='k', to_field='id', null=True, blank=True)
code = models.CharField(max_length=64, null=True,blank=True)
method = models.CharField(max_length=16, null=True,blank=True)
kwargs = models.CharField(max_length=128, null=True,blank=True)
is_menu = models.BooleanField(default=False)
def __str__(self):
return self.caption
class Role(models.Model):
name = models.CharField(max_length=32)
def __str__(self):
return self.name
class RoleToPermission(models.Model):
menu_id = models.ForeignKey(Permission, to_field='id')
role_id = models.ForeignKey(Role, to_field='id')
def __str__(self):
return "%s-%s" %(self.menu_id.caption, self.role_id.name)
# 目标,根据角色列表获取权限 li
# 获取当前用户的所有标题权限
# RoleToPermission.objects.filter(role_id__in=li,menu_id__is_menu=True).\
# values('menu_id__caption','menu_id__parent_id','menu_id__parent_id','menu_id__code')
# 获取当前用户的所有权限
# RoleToPermission.objects.filter(role_id__in=li).\
# values('menu_id__caption','menu_id__parent_id','menu_id__parent_id','menu_id__code')
class UserInfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
def __str__(self):
return self.username
class UserInfoToRole(models.Model):
user_id = models.ForeignKey(UserInfo, to_field='id')
role_id = models.ForeignKey(Role, to_field='id')
def __str__(self):
return '%s-%s' %(self.user_id.username, self.role_id.name)