权限控制 - 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的访问权限。
所以代码实现的思路是现将资源的访问权限拉出来,再看用户有没有访问的权限。