Django用户权限分配

django的admin后台自带用户权限管理,能够为用户指定特定的视图权限。实际应用中还不够强大,比如有更新项目20个,共用的是同一个视图views函数,如果给不同用户分配不同项目更新权限,Django自带的admin管理后台就办不到了,它的粒度只到视图级别,这是就需要自己开发了。还有个问题就是web端展示,就像zabbix样,需要向不同的用户展示不同的功能,这个admin后台也是做不到的。下面就这两点简单阐述下我实现的方法,简单、粗暴,第一次写这种功能,不好还多多指教。

1、同一个视图,不同用户分配不同的项目更新权限。
这个比较简单,因为每个项目的URL是不一样的,只要创建一个用户与URL一一对应的关系即可,视图最开始判断下该用户是不是有这个权限就可以了,如果没有权限重定向到404页面等处理。
这个代码比较简单就不献丑了,后台为用户添加URL权限的页面是这样的:
djangocas01

2、不同用户页面展示不同的功能。
这个有点复杂,我首先定义了一个全局的URL拓扑(这样表达可能比较生动,嘿嘿),每个页面上的功能定义一个唯一的坐标,通过后台给用户添加对应的功能,这样就可以获取每个用户自己的URL拓扑,然后结合django的模板就可以为不同的用户展示不同的功能了。
录入URL信息,本来想自动读取urls的,发现比较麻烦,可能是我水平有限,还是来点简单的
djangocas02
定义全局的URL拓扑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#casClass config
#默认拓扑,默认都关闭
casmap=[
[0],
[0,[0,0]],
[0,[[0,[0,0]],[0,[0,0,0,0]],[0,[0,0,0]],[0,[0,0,0,0,0,0,0]]]],
[0,[0,0]],
]
#超级用户的拓扑,默认都打开
casmaproot=[
[1],
[1,[1,1]],
[1,[[1,[1,1]],[1,[1,1,1,1]],[1,[1,1,1]],[1,[1,1,1,1,1,1,1]]]],
[1,[1,1]],
]

然后根据定义的URL坐标和用户所属的URL生成用户自己的URL拓扑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#返回当前用户的url的拓扑结构
def checkUser(user):
logger = logging.getLogger('diewu')
if str(user) in userroot:
logger.info('find super user ' + str(user))
return casmaproot
sql = 'select layer01,layer02,layer03 from appcas_urlinfo as c join appcas_casusers as u on c.url=u.url and u.username="%s" where u.switch=1' % user
urls = CasUsers.objects.getclass(sql)
for url in urls:
if url[0] != 0 and url[1] != 0 and url[2] != 0:
casmap[url[0]-1][0]=1
casmap[url[0]-1][1][url[1]-1][0]=1
casmap[url[0]-1][1][url[1]-1][1][url[2]-1]=1
elif url[0] != 0 and url[1] != 0:
casmap[url[0]-1][0]=1
casmap[url[0]-1][1][url[1]-1]=1
elif url[0] != 0:
casmap[url[0]-1][0]=1
#logger.info(casmap)
return casmap

通过上面的函数就可以为每个用户生成特定的URL拓扑了,结合django的模板渲染功能就可以展现用户自己的模块。
举个例子,模板的部分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{% if cmap.0.0 %}
<li class="current">
<a href="{%url 'sqlCount'%}">
<i class="icon-dashboard"></i>
控制台
</a>
</li>
{%endif%}
<!--start of zabbix status and graph-->
{% if cmap.1.0 %}
<li {%block zabbix_open%}{%endblock%}>
<a href="javascript:void(0);"><i class="icon-desktop"></i>监控概览</a>
<ul class="sub-menu">
{% if cmap.1.1.0 %}
<li {%block zabbix_graph_active%}{%endblock%}><a href="{%url 'zabbixGraph'%}"><i class="icon-angle-right"></i>监控图形</a></li>
{% endif %}
{% if cmap.1.1.1 %}
<li><a href="#"><i class="icon-angle-right"></i>监控状态</a></li>
{% endif %}
</ul>
</li>
{% endif %}
<!--end of zabbix status and graph-->

截图几张展示下效果:
普通用户的页面:
djangocas03
超级用户的页面:
djangocas04
没有权限返回的页面:
djangocas05
这个用户权限分配写的比较粗糙,只是用了我认为比较简单的代码实现了能用的功能,不足之处多多还望大神们多多指教。

----------------本文结束 感谢阅读----------------