权限控制 - linchuan1982/meta GitHub Wiki

权限控制

asset的权限

    user = User.objects.get(pk=user_id)
    huazi_groups = []
    for huazi_group in HuaziGroup.objects.all():
        permission = huazi_group.permission
        permission_name = '%s.%s' % (permission.content_type.app_label, permission.codename)
        # TODO monkey patch to support Permission object with User.has_perm
        if user.has_perm(permission_name):
            huazi_groups.append(huazi_group)
		判断该用户是否有对应的访问权限
	这段代码的作用是获取到用户有权限访问的huazi_groups




    huazis = Huazi.objects.filter(groups__in=huazi_groups, type__in=filter_types).order_by('category', '-weight').distinct()

1. huazi_group的内容:

NAME | DESC | PERMITION

  • | - | - general | 普通组 | asset/huazi/Can change huazi
    partner_pear | 梨视频 | asset/assets/Pearvideo Assets 新京报 | xinjingbao | asset/assets/xinjingbao assets

获取到permission_name 为asset/huazi/Can change huzi user.has_perm:
groups
permission
auth下的user可以属于某些groups,即获取到了group的权限
也可以单独赋予权限,但通常都使用group来做
Auth的结构:
groups->对应的group有不同权限,按照name来区分
permissions->定义所有的权限,其实是代码生成的
Users->groups
->permissions

2. 逻辑如下:

对于新京报,希望能获取到general和新京报的资源,而梨视频希望只获取到梨视频的资源。
那么,在创建新京报组的时候,其权限应当配置为:
asset/assets/xinjingbao assets
asset/huazi/Can change huzai

同理,对于梨视频的用户,应该在对应的group里面创建: asset/assets/Pearvideo Assets

3. 一个新京报的用户进来,用huazi_group里面的权限匹配自己的权限,

mysql> select * from asset_huazigroup;

id name desc memo permission_id
1 所有用户专用贴图 普通用户 71
2 梨视频专用贴图 pearvideo 176
3 测试花字 staff 180
4 腾讯新闻今日速览专用贴图 腾讯新闻专用今日速览 188
5 腾讯新闻贴图SVG 腾讯新闻贴图SVG 211
6 watchthis字幕贴图 watchthis字幕贴图 212
7 新京报包装 新京报包装 238

mysql> select * from auth_group_permissions where permission_id = 71;

id group_id permission_id
17 4 71
25 6 71
164 25 71

mysql> select * from auth_group where id in (4, 6, 25);

id name
4 staff
6 general
25 partner_miaopai

mysql> select * from auth_permission where id = 71;

id name content_type_id codename
71 Can change huazi 24 change_huazi

4. 查找用户对应的权限

mysql> select * from account_profile where cell = '13851549691'\G

*************************** 1. row ***************************
user_id: 36361
cell: 13851549691
sms_code: 1226
sms_time: 2018-04-08 07:30:49.919522
1 row in set (0.00 sec)

mysql> select * from auth_user_groups where user_id=36361;

id user_id group_id
8707 36361 2
5248 36361 6
2 rows in set (0.01 sec)

mysql> select * from auth_group where id in (2, 6)

id name
2 first_class_vip
6 general
2 rows in set (0.01 sec)

mysql> select * from auth_group_permissions where group_id in (2, 6);

id group_id permission_id
11 2 34
5 2 91
12 2 110
3 2 132
6 2 139
8 2 140
29 2 187
48 2 192
107 2 239
26 6 68
25 6 71
86 6 206
12 rows in set (0.01 sec)

从上面看到,我只有71的权限,所以只能访问到对应71的资源。

mysql> select * from auth_user_user_permissions where user_id=36361;

id user_id permission_id
1418 36361 140
1 row in set (0.01 sec)

mysql> select * from auth_permission where id = 140

id name content_type_id codename
140 Access Youtube API 26 access_youtube_api
1 row in set (0.01 sec)

5. 当前的实现是一个资源只属于一个gourp,但是一个用户可以有多个group的访问权限。

所以代码实现的思路是现将资源的访问权限拉出来,再看用户有没有访问的权限。