【干货分享】使用Django轻松几步搞定用户认证功能

但凡是一个公开使用的系统,都离不开认证登录这个模块,如何快速出一个基本的认证登录页面供使用则是经常遇到的问题。好在django有一套成型的注册登录模块可供使用。如果你跟我一样不想重复造轮子,那么这篇分享或许可以帮你快速完成任务。
下面就几个关键常用的问题以FAQ的方式给出我在这块的学习总结笔记。

FAQ

Q: 使用Django自带的认证系统,大致流程是什么

默认支持的是本地认证

1、settings.py中加上auth/session等相关的中间件及APP;

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
INSTALLED_APPS = (
'django.contrib.auth', 
'django.contrib.contenttypes',  
'django.contrib.sessions',  
'django.contrib.sites',
'django.contrib.messages',
)

2、运行 python manage.py syndb (django 1.7及以上版本,先后使用makemigrations、migrate命令替代)生成相应的表并设置管理员帐户及密码

3、urls.py 中分别加登入登出入口 url;

from django.contrib.auth.views import login, logout_then_login
url(r'^accounts/login/$',  login, {'template_name': 'manage/index.html'}),   # 指定登录页面模板
url(r'^accounts/logout/$', logout_then_login),    # 退出登录,并跳转到登录页面

4、settings.py中加 LOGIN_URL(未通过认证时跳转的认证页面) 和 LOGIN_REDIRECT_URL (登录成功后默认跳转的页面)

5、加认证登录模板文件

{% extends "base.html" %} 
{% block body %} 
  {% if form.errors %} 
    <p class="error">Sorry, that's not a valid username or password</p> 
  {% endif %} 

  <form action='.' method='post'> 
    {% csrf_token %}
    <label for="username">User name:</label> 
    <input type="text" name="username" value="" id="username"> 
    <label for="password">Password:</label> 
    <input type="password" name="password" value="" id="password"> 

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

{% endblock %} 

6、写好系统所需的视图函数即可搞定。

Q: 如何创建用户?

使用 create_user 辅助函数创建用户:

from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')
user.save

Q: 如何修改密码?

root@poinx:/var/www# python manage.py shell
Python 2.7.3 (default, Dec 18 2014, 19:10:20) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.auth.models import User
>>> user = User.objects.get(username='admin')
>>> user.set_password('Nsf0cus')
>>> user.save()
>>> quit()
root@poinx:/var/www# 

Q: @login_required怎么用?

在django项目中,经常会看到下面这样的代码:

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

里面有一个@login_required标签。其作用就是告诉程序,使用这个方法是要求用户登录的。

1.如果用户还没有登录,默认会跳转到‘/accounts/login/’。这个值可以在settings文件中通过LOGIN_URL参数来设定。(后面还会自动加上你请求的url作为登录后跳转的地址,如: /accounts/login/?next=/polls/3/ 登录完成之后,会去请求/poll/3)

2.如果用户登录了,那么该方法就可以正常执行

如果LOGIN_URL使用默认值,那么在urls.py中还需要进行如下设置:(加入下面这句)

 (r'^accounts/login/$', 'django.contrib.auth.views.login'),

这样的话,如果未登录,程序会默认跳转到“templates\registration\login.html”这个模板。

如果想换个路径,那就再加个template_name参数,如下:

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

这样程序就会跳转到templates\myapp\login.html”

Q: 如何进行第三方认证?

第三方认证,也称“外部认证”,这里以Radius认证为例。

1、设置“认证后端”列表

在settings中设置AUTHENTICATION_BACKENDS参数,默认被设置为:(‘django.contrib.auth.backends.ModelBackend’,) AUTHENTICATION_BACKENDS 的顺序是重要的,所以如果相同的用户名和密码在多个后端中同时存在, Django 会在第一个匹配的地方停止。 示例:

示例

示例

2、编写一个认证后端

一个认证后端是一个执行两个方法的类: get_user(user_id) 和 authenticate(**credentials) 。

get_user 方法需要一个 user_id (可以是一个用户名、数据库 ID 或其他东东),并且返回一个用户对象。

authenticate 方法有一个证书关键字参数。多数情况下看上去如下:

class MyBackend:
def authenticate(self, username=None, password=None): // 检查用户名和密码并返回一个用户。

但是也可以认证一个标志,象下面这样:

class MyBackend:
def authenticate(self, token=None): // 检查标志并返回一个用户。

以下是一个后端实例,其中radius.py提供了auth类供该后端调用:

auth类

auth类

其它说明

如果你只需要做一个Demo供展示或对认证等的要求并不高,那么以上内容足够使用。但如果涉及到用户、组、权限的管理,还需要了解更多内容,可查阅相关文档。

如果您需要了解更多内容,可以
加入QQ群:486207500
直接询问:010-68438880-8669

Spread the word. Share this post!

Meet The Author

Leave Comment