全部博文(2065)
分类: Python/Ruby
2010-01-11 17:25:43
整理Django平台中如何添加用户权限
[整理人:hkebao#126.com 整理时间:
测试平台:Django1.0.X平台
当前状态:后台的代码编写完成了,就是没有做一个管理登录。即用户不需要登录就可以直接打开管理后台。现在我需要将这个判断的功能添加进来!
一、有关Django权限的背景资料
1、我登录Django自带的管理后台
试着去添加一个新的用户进来!才发现原来
在我们新加一个用户的时候是能够指定用户权限的!我查看了一下好像是以应用为单位的。即对每一个应用的管理权限的设置!
2、我试图添加一个新的用户,但是我没有给它赋上任何的权限。结果我在管理后台中做测试发现好像没有生效。我全部的操作还是可以正常地进行操作的。就说明我的权限并没有生效呀!
我又去测试了一下原来发现我是有一个地方没有选对。我将 超级用户 这一块不选。这就意昧着这个用户它不是超级用户了。然后我再将它的权限也不选择。结果果然这个用户就在管理后台没有权限了。
于是我再将权限给它赋上。再测试结果权限又回来了。
PS:如果对某个用户没有勾选上超级用户。它的权限操作仅限于你对它所做的选择。如果你对某个应用勾选上权限的话就表示此用户对这个应用有权限操作!
官方文档:
人员状态检查框如果不打勾,则你的用户也无法使用,因为他不能登录。也许你担心,如果打勾了,那不是他就能做好多事了吗?其实不然。在 Django 中,创建一个 app 之后都有一些基本的权限会自动生成,而这些除了超级用户,它们是不会自动赋给某个用户的。因此如果管理员不给某个用户关于 app 的使用权限,那么这个用户根本没有办法操纵这些 app ,甚至连看都看不到(大家自已试一下就知道了)。这样他能够做的只是登录,但这也许就够了,有时我们需要的就是一个用户的合法身份,而不是一定要他能做些什么。
我验证过确实如此。不过以上测试我仅仅是对Django自带的后台权限管理模块做的!并没有应用于我自己的工程项目!
PS:request 对象提供一个 user 对象,你可以根据它来判断当前用户的身份,所属的组,所拥有的权限。我们可以在 view 代码中进行用户身份的检查。
(相当于我们PHP里面的一个$_ENV变量 环境变量存储一些常用的信息)
三、像我们传统的方法是将用户登录的用户名之类的信息保存到session中去。看一下如何在Django系统中添加session变量进行保存用户名等相关信息!
开始引入进来session的概念!
在不同的页面间的数据交换可以通过走session与cookie 。其中页面之前传递的这些变量是通过session_id进行传递之用的!而且这个ID值是被保存到cookie中。
PS:在 Django 中的 session 也非常简单,它就存在于 request 对象的 session 属性中。你可以把它看成一个字典就可以了。
其中session 的操作方法可以整理如下:
request.session['username'] = username 字典类型赋值
username = request.session.get('username', None) 从字典类型取值
del request.session['username'] 从字典类型删除值
四、应用进来
添加一个登录页面出来。视图层的代码将用户名提交并保存到一个session键值对象中去。
在其它的全部页面中添加一个权限检查
五、如果现在有多个应用了。如何给应用同步权限进来
以上是我们使用了传统的方法进行登录。现在采用其内置的方法进行权限判断
现在我将我的认证机会换过来。直接使用其内置的认证方法处理
Django 在 “django.contrib.auth“ 提供了2个函数: “authenticate()“和 “login()“ 。如果通过给定的用户名和密码做认证,请使用
“authenticate()“ 函数。他接收2个参数,一个是
username“ 一个是 “password“ 。如果认证成功,它返回一个 “User“ 对象。如果密码无效,它返回一个 “None“ 。
例如::
from
django.contrib.auth import authenticate
user = authenticate(username=’john’, password=’secret’)
if user is not None:
print “用户名、密码正确!”
else:
print “用户名、密码错误!”
在视图中登录一个用户的话,使用 “login()“ 函数。它接收 “HttpRequest“
对象和一个 “User“ 对象。
“login()“ 通过Django的session框架把用户的ID保存到session中。所以,你要确认你已经安装了session中间件。
我的调用示例:
from django.contrib.auth import authenticate, login
from
django.contrib.auth import logout
def confirm(request):
username = request.POST['name'].strip()
password = request.POST['pass'].strip()
user = authenticate(username=username,
password=password)
if user is not None:
login(user)
return render_to_response('common/index.html')
else:
return render_to_response('login/login.html')
六、还是直接使用session的方法操作吧。外加上一个装饰器方法进来
不需要用自带的方法吧。还是套用旧的办法实施
username = request.session.get('username', None)
if username:
print “正常的视图层代码”
else:
return
render_to_response('login/login.html')
写一个用来验证用户登录信息的装饰器
def login_dec(func):
def rlt(request):
username = request.session.get('username', None)
if username:
return func(request)
else:
return render_to_response('login/login.html')
return rlt
在任何一个应用中都是可以直接导入此装饰器进来的!
目前就是这样的应用!
总结:目前还是使用session 的方法进行相应的操作处理。