[django]总结Django中的用户权限模块

原文:http://maplye.iteye.com/blog/448960html

该模块由
用户(Users)
权限(Permissions)
组(Groups)
消息(Messages)数据库

一、安装
1)将'django.contrib.auth'添加到Setting.py的INSTALLED_APPS 中
2)安装数据库 manage.py syncdb.
其实用户权限模块是Django本身已经写好的app,因此他也具备自身的Models,因此须要同步数据库。django

二、User
1)属性
其中他包含User类,他具备如下字段
username,first_name,last_name,email,password,is_staff(是否具备进入网站管理权限),
is_active,is_superuser,last_login,date_joined.app

这是Django自带的User的基本的信息,若是你要使用该权限模块,就必需要使用他的User类,
可是一般状况下,咱们的用户信息还会有其余的属性,这时咱们能够再增长一类来扩展,该类和User的关系是OneToOne。
如:
#这是china-django中的代码post

class Profile(models.Model):
  user = models.OneToOneField(User)网站

  blog = models.CharField(maxlength=128, blank=True)
  location = models.CharField(maxlength=128, blank=True)
  occupation = models.CharField(maxlength=64, blank=True)

  reward = models.IntegerField(default=0, blank=True)
  topic_count = models.IntegerField(default=0, blank=True)
  post_count = models.IntegerField(default=0, blank=True)

  class Admin:
    list_display = ('user', 'blog', 'location', 'occupation', 'reward', 'topic_count', 'post_count')ui

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):给某用户发送邮件this

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错误url

三、User的验证
1)登录(Login)code

from django.contrib.auth import authenticate, login

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


首先咱们要验证这个用户,而后再登录,登录成功后,咱们能够经过request.user 来获得当前登录的用户对象。

2)注销(Logout)

from django.contrib.auth import logout

def logout_view(request):
  logout(request)
  # Redirect to a success page.


3)限制非法用户访问
最普通的方法是经过request.user.is_authenticated()来判断

from django.http import HttpResponseRedirect

def my_view(request):
  if not request.user.is_authenticated():
    return HttpResponseRedirect('/login/?next=%s' % request.path)
  #


另外有一快捷的方法login_required

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
  #

这样当你访问my_view的时候,就须要用户须要经过验证.若不经过则跳转到
/accounts/login/?next=/polls/3/
并将当前访问的页面做为他的一个参数,而且传递三个Context变量
form 一个FormWrapper 对象用来重构登录表单
next 就是你访问的当前页面
site_name 当前站点名称,在Setting.py中设置SITE_ID的值

另外,咱们还须要在你的urls里面配置/accounts/login路径
下面有两种两种,不一样的是使用不一样的模版,第一种默认使用registration/login.html 模版,第二种方式是咱们自定义模版

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

一个login.html模版的实例:

{% extends "base.html" %}

{% block content %}

{% if form.has_errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}

<form method="post" action=".">
<table>
<tr><td><label for="id_username">Username:</label></td><td>{{ form.username }}</td></tr>
<tr><td><label for="id_password">Password:</label></td><td>{{ form.password }}</td></tr>
</table>

<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>

{% endblock %}

4)用户是否有权限访问

当咱们建立了一个带有class Admin:内类的类后,会自动add, create 和 delete三种权限,不过咱们也能够本身定义权限。
以下:

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

这样咱们为USCitizen类定义了三种自定义的权限,其中第一项是codename,第二项是discription。

当咱们定义好权限后,咱们能够经过user.has_perm来判断是否具备权限

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

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/')

四、template中的用户验证
Users

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

Permissions

{{ perms.foo }},一个已经登录的用户对foo的app只要有任何的权限,{{ perms.foo }}就会等于True,反之为False
{{ perms.foo.can_vote }}, 这个很清楚了...
实例以下:

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

五、authentication backends
Django中队用户的验证都是经过自身的模块,也可使用其余的模块。
默认的AUTHENTICATION_BACKENDS 是
('django.contrib.auth.backends.ModelBackend',)

咱们能够本身写一个不一样的用户验证方式,但必须具备get_user 和authenticate方法
如:

from django.conf import settings
from django.contrib.auth.models import User, check_password

class SettingsBackend:
  """
  Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.

  Use the login name, and a hash of the password. For example:

  ADMIN_LOGIN = 'admin'
  ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de'
  """
  def authenticate(self, username=None, password=None):
    login_valid = (settings.ADMIN_LOGIN == username)
    pwd_valid = check_password(password, settings.ADMIN_PASSWORD)
    if login_valid and pwd_valid:
      try:
        user = User.objects.get(username=username)
      except User.DoesNotExist:
        # Create a new user. Note that we can set password
        # to anything, because it won't be checked; the password
        # from settings.py will.
        user = User(username=username, password='get from settings.py')
        user.is_staff = True
        user.is_superuser = True
        user.save()
      return user
    return None

  def get_user(self, user_id):
    try:
      return User.objects.get(pk=user_id)
    except User.DoesNotExist:
      return None

这个时候咱们须要修改SettingAUTHENTICATION_BACKENDS = ( 'sputnik.backends.ldapBackend.LDAPBackend',)

相关文章
相关标签/搜索