django认证系统

Django认证系统同时处理认证和受权。简单地讲,认证验证一个用户是否它们声称的那我的,受权决定一个经过了认证的用户被容许作什么。这里的词语“认证”同时指代这两项任务。html

认证系统包含:
python

  • 用户数据库

  • 权限:二元(是/否)标志指示一个用户是否能够作一个特定的任务。django

  • 组:对多个用户运用标签和权限的一种通用的方式。安全

  • 一个可配置的密码哈希系统session

  • 用于登陆用户或限制内容的表单和视图框架

  • 一个可插拔的后台系统ide



使用:ui

位于django.contrib.auth,配置在settings.py中的url

INSTALLED_APPS = [

    'django.contrib.auth', #包含认证框架的核心和默认的模型。

    'django.contrib.contenttypes',] #是Django内容类型系统,它容许权限与你建立的模型关联。

MIDDLEWARE = [

    'django.contrib.sessions.middleware.SessionMiddleware',#管理请求之间的会话

    'django.contrib.auth.middleware.AuthenticationMiddleware',] #使用会话将用户与请求关联起来。

有了这些设置,运行manage.py migrate命令将为认证相关的模型建立必要的数据库表并为你的应用中定义的任意模型建立权限


登陆:

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:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
        else:
            # Return a 'disabled account' error message
            ...
    else:
        # Return an 'invalid login' error message.
        ...

注销:

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

只容许登陆的用户访问:

方法一:

from django.conf import settings
from django.shortcuts import redirect
def my_view(request):
    if not request.user.is_authenticated():
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
    # ...

方法二:

login_required装饰器

from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
    ...

    主要完成两件事:

    一、若是用户没有登入,则重定向到settings.LOGIN_URL(须要设置),并将当前访问的绝对路径传递到查询字符串中。例如:/accounts/login/?next=/polls/3/。

    二、若是用户已经登入,则正常执行视图。视图的代码能够安全地假设用户已经登入。

from django.contrib.auth.decorators import login_required
@login_required(login_url='/accounts/login/')
def my_view(request):
    ...

注意,若是你没有指定login_url参数,你须要确保settings.LOGIN_URL与你的登陆视图正确关联。例如,使用默认值,能够添加下面几行到你的URLconf中:

from django.contrib.auth import views as auth_views
url(r'^accounts/login/$', auth_views.login),


跳转到登陆以前的页面,即next=XXX页面:

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
@login_required(login_url='/accounts/login/')
def my_view(request):
    return redirect(request.GET.get('next') or '/')
相关文章
相关标签/搜索