[django]總結Django中的用戶權限模塊

此文是總結Django官方網站裏面的Document的文章 User authentication in Django
http://www.djangoproject.com/documentation/authentication/


該模塊由
用戶(Users)
權限(Permissions)
組(Groups)
消息(Messages)

這些從字面上也都很好的理解,但是我對消息(Messages)還不是很理解…………


1、安裝
1)將'django.contrib.auth'添加到Setting.py的INSTALLED_APPS 中
2)安裝數據庫 manage.py syncdb.
其實用戶權限模塊是Django自己已經寫好的app,所以他也具有自身的Models,所以需要同步數據庫。

2、User
1)屬性
其中他包含User類,他具有以下字段
username,first_name,last_name,email,password,is_staff(是否具有進入網站管理權限),
is_active,is_superuser,last_login,date_joined.

這是Django自帶的User的基本的信息,如果你要使用該權限模塊,就必須要使用他的User類,
但是通常情況下,我們的用戶信息還會有其他的屬性,這時我們可以再增加一類來擴展,該類和User的關係是OneToOne。
如:
#這是china-django中的代碼

None.gifclass Profile(models.Model):
None.gif    user 
= models.OneToOneField(User)
None.gif
None.gif    blog 
= models.CharField(maxlength=128, blank=True)
None.gif    location 
= models.CharField(maxlength=128, blank=True)
None.gif    occupation 
= models.CharField(maxlength=64, blank=True)
None.gif    
None.gif    reward 
= models.IntegerField(default=0, blank=True)
None.gif    topic_count 
= models.IntegerField(default=0, blank=True)
None.gif    post_count 
= models.IntegerField(default=0, blank=True)
None.gif    
None.gif    
class Admin:
None.gif        list_display 
= ('user''blog''location''occupation''reward''topic_count''post_count')
None.gif
None.gif

2)方法
這裏列舉幾個主要的方法
is_anonymous():是否爲匿名用戶,如果你已經login,則這個方法返回始終爲false.
is_authenticated():是否通過驗證,也就是通過用戶名和密碼判斷該用戶是否存在.
get_group_permissions():得到所有該用戶所屬組別的權限.
get_all_permissions():得到該用戶所有的權限.
has_perm(perm):判斷用戶是否具有特定權限,perm的格式是appname.codename.
email_user(subject, message, from_email=None):給某用戶發送郵件


3) AnonymousUser
AnonymousUser是繼承自User接口,但是和User有不同處:
id屬性爲None
is_anonymous() 返回始終爲True
is_authenticated() 返回始終爲False
has_perm() 返回始終爲False
set_password(), check_password(), save(), delete(), set_groups()和set_permissions() 都會觸發 NotImplementedError錯誤


3、User的驗證
1)登陸(Login)

None.giffrom django.contrib.auth import authenticate, login
None.gif
None.gif
def my_view(request):
None.gif    username 
= request.POST['username']
None.gif    password 
= request.POST['password']
None.gif    user 
= authenticate(username=username, password=password)
None.gif    
if user is not None:
None.gif        login(request, user)
None.gif        
# Redirect to a success page.
None.gif
    else:
None.gif        
# Return an error message.
None.gif

None.gif

首先我們要驗證這個用戶,然後再登陸,登陸成功後,我們可以通過request.user 來得到當前登陸的用戶對象。

2)註銷(Logout)

None.giffrom django.contrib.auth import logout
None.gif
None.gif
def logout_view(request):
None.gif    logout(request)
None.gif    
# Redirect to a success page.
None.gif

None.gif

3)限制非法用戶訪問
最普通的方法是通過request.user.is_authenticated()來判斷

None.giffrom django.http import HttpResponseRedirect
None.gif
None.gif
def my_view(request):
None.gif    
if not request.user.is_authenticated():
None.gif        
return HttpResponseRedirect('/login/?next=%s' % request.path)
None.gif    
# dot.gif
None.gif

None.gif

另外有一快捷的方法login_required

None.giffrom django.contrib.auth.decorators import login_required
None.gif
None.gif@login_required
None.gif
def my_view(request):
None.gif    
# dot.gif
None.gif

None.gif

這樣當你訪問my_view的時候,就需要用戶需要通過驗證.若不通過則跳轉到
/accounts/login/?next=/polls/3/
並將當前訪問的頁面作爲他的一個參數,並且傳遞三個Context變量
form 一個FormWrapper 對象用來重構登陸表單
next 就是你訪問的當前頁面
site_name 當前站點名稱,在Setting.py中設置SITE_ID的值

另外,我們還需要在你的urls裏面配置/accounts/login路徑
下面有兩種兩種,不同的是使用不同的模版,第一種默認使用registration/login.html 模版,第二種方式是我們自定義模版

None.gif(r'^accounts/login/$''django.contrib.auth.views.login'),
None.gif(r
'^accounts/login/$''django.contrib.auth.views.login', {'template_name''myapp/login.html'}),
None.gif

一個login.html模版的實例:

None.gif{% extends "base.html" %}
None.gif
None.gif{% block content %}
None.gif
None.gif{% if form.has_errors %}
None.gif
<p>Your username and password didn't match. Please try again.</p>
None.gif{% endif %}
None.gif
None.gif
<form method="post" action=".">
None.gif
<table>
None.gif
<tr><td><label for="id_username">Username:</label></td><td>{{ form.username }}</td></tr>
None.gif
<tr><td><label for="id_password">Password:</label></td><td>{{ form.password }}</td></tr>
None.gif
</table>
None.gif
None.gif
<input type="submit" value="login" />
None.gif
<input type="hidden" name="next" value="{{ next }}" />
None.gif
</form>
None.gif
None.gif{% endblock %}
None.gif

4)用戶是否有權限訪問

當我們創建了一個帶有class Admin:內類的類後,會自動add, create 和 delete三種權限,不過我們也可以自己定義權限。
如下:

None.gifclass USCitizen(models.Model):
None.gif    
# 
None.gif
    class Meta:
None.gif        permissions 
= (
None.gif            (
"can_drive""Can drive"),
None.gif            (
"can_vote""Can vote in elections"),
None.gif            (
"can_drink""Can drink alcohol"),
None.gif        )
None.gif

這樣我們爲USCitizen類定義了三種自定義的權限,其中第一項是codename,第二項是discription。 

當我們定義好權限後,我們可以通過user.has_perm來判斷是否具有權限

None.gifdef my_view(request):
None.gif    
if not (request.user.is_authenticated() and request.user.has_perm('polls.can_vote')):
None.gif        
return HttpResponse("You can't vote in this poll.")
None.gif

has_perm的參數應該是appname(packname) + . + codename

還有一種更簡便的方式,如下:
@user_passes_test(lambda u: u.has_perm('polls.can_vote'))
這樣如果該用戶沒有權限,則自動跳轉到/accounts/login/,也可以自定義跳轉
@user_passes_test(lambda u: u.has_perm('polls.can_vote'), login_url='/login/')

4、template中的用戶驗證
Users

None.gif{% if user.is_authenticated %}
None.gif    
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>    
None.gif{% else %}
None.gif    
<p>Welcome, new user. Please log in.</p>
None.gif{% endif %}

Permissions
{{ perms.foo }},一個已經登陸的用戶對foo的app只要有任何的權限,{{ perms.foo }}就會等於True,反之爲False
{{ perms.foo.can_vote }}, 這個很清楚了...
實例如下:

 

None.gif{% if perms.foo %}
None.gif    
<p>You have permission to do something in the foo app.</p>
None.gif    {% if perms.foo.can_vote %}
None.gif        
<p>You can vote!</p>
None.gif    {% endif %}
None.gif    {% if perms.foo.can_drive %}
None.gif        
<p>You can drive!</p>
None.gif    {% endif %}
None.gif{% else %}
None.gif    
<p>You don't have permission to do anything in the foo app.</p>
None.gif{% endif %}
None.gif
None.gif

5、authentication backends
Django中隊用戶的驗證都是通過自身的模塊,也可以使用其他的模塊。
默認的AUTHENTICATION_BACKENDS 是
('django.contrib.auth.backends.ModelBackend',)

我們可以自己寫一個不同的用戶驗證方式,但必須具有get_user 和authenticate方法
如:

None.giffrom django.conf import settings
None.gif
from django.contrib.auth.models import User, check_password
None.gif
None.gif
class SettingsBackend:
None.gif    
"""
None.gif    Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.
None.gif
None.gif    Use the login name, and a hash of the password. For example:
None.gif
None.gif    ADMIN_LOGIN = 'admin'
None.gif    ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de'
None.gif    
"""
None.gif    
def authenticate(self, username=None, password=None):
None.gif        login_valid 
= (settings.ADMIN_LOGIN == username)
None.gif        pwd_valid 
= check_password(password, settings.ADMIN_PASSWORD)
None.gif        
if login_valid and pwd_valid:
None.gif            
try:
None.gif                user 
= User.objects.get(username=username)
None.gif            
except User.DoesNotExist:
None.gif                
# Create a new user. Note that we can set password
None.gif
                # to anything, because it won't be checked; the password
None.gif
                # from settings.py will.
None.gif
                user = User(username=username, password='get from settings.py')
None.gif                user.is_staff 
= True
None.gif                user.is_superuser 
= True
None.gif                user.save()
None.gif            
return user
None.gif        
return None
None.gif
None.gif    
def get_user(self, user_id):
None.gif        
try:
None.gif            
return User.objects.get(pk=user_id)
None.gif        
except User.DoesNotExist:
None.gif            
return None
None.gif

這個時候我們需要修改Setting
AUTHENTICATION_BACKENDS = (
 'sputnik.backends.ldapBackend.LDAPBackend',
)

這裏還有一片關於Authentication Backends的文章

LDAP Authentication in Django with Backends

全文結束,談不上總結,因爲缺少我的體會和心得,也談不上翻譯,因爲my englishi is Poor.

See You!!!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章