您的位置:首页 > 编程语言 > Go语言

DJANGO DJANGO1.6中自定义用户身份验证功能的教程[附源码]

2014-10-30 14:16 549 查看
五月
8, 2014 ROBOT
4条评论http://blog.objcc.com/customizing-authentication-in-django/

本教程用于帮大家熟悉如何在Django中自定义用户身份验证功能。通过一个自定义的身份验证类,实现一个最简单的用户验证功能。

项目的目标:

123用户在登录admin后台时必需使用我们在settings.py中预先定义好的用户名和密码。首次登录admin后台会将用户作为管理员记录到数据库表中。通过一个最简单的APP测试身份验证功能是否有效。
说明:本示例中的部分代码源自Django官方网站的documentation,代码运行测试环境为Django1.6。首先创建工程,名称叫”test_auth”:

1

2

$
django-admin.py
startproject
test_auth

$
cd
test_auth/

启动服务:

1$ python manage.py runserver
浏览器访问 http://127.0.0.1:8000 看到下图的网页说明一切正常:

然后同步数据库,创建默认的数据库表,注意:当提示是否创建管理员用户时输入no:

1

$python
manage.py
syncdb

Creating tables …

Creating table django_admin_log

Creating table auth_permission

Creating table auth_group_permissions

Creating table auth_group

Creating table auth_user_groups

Creating table auth_user_user_permissions

Creating table auth_user

Creating table django_content_type

Creating table django_session

You just installed Django’s auth system, which means you don’t have any superusers defined.

Would you like to create one now? (yes/no): no

Installing custom SQL …

Installing indexes …

Installed 0 object(s) from 0 fixture(s)

创建数据库完成后可以看到结果是0 object,也就是表中没有任何记录。

接下来先为用户定义个密码,为了简单,密码就叫‘what’吧,虽然看上去有点傻,不过确实很简单:

1234$python manage.py shellfrom django.contrib.auth.models import make_passwordmake_password('what')u'pbkdf2_sha256$12000$cQVmovdDUk7t$XPlZ4C+ZK/ypWUtIQCs+jPxZZhDHgN7yYvU2Oc0OIGE='
有了密码hash我们将它连同用户名一起配置到settings.py中:

1

$
vi
test_auth/settings.py

将如下两行加到文件最后(注意密码不是明码而是上一步我们生成它的hash):

12ADMIN_LOGIN = 'admin'ADMIN_PASSWORD = 'pbkdf2_sha256$12000$cQVmovdDUk7t$XPlZ4C+ZK/ypWUtIQCs+jPxZZhDHgN7yYvU2Oc0OIGE='
现在说到关键,自定义用户验证类app我们起名为’myauth’,类名为官网文档中的’SettingsBackend’,继续修改settings.py,在INSTALLED_APPS的最后加上’myauth’(这里先配置,接下来我们会实现这个类):

1

2

3

4

INSTALLED_APPS =
(

...

'myauth',

)

同时在配置文件中加上AUTHENTICATION_BACKENDS配置,Django会使用这里配置的Backend进行用户验证工作:

1AUTHENTICATION_BACKENDS=('myauth.SettingsBackend.SettingsBackend', )
下面是实现‘myauth’的时候了:

1

2

3

4

$
mkdir
myauth

$
cd
myauth/

$
touch
__init__.py

$
vi
SettingsBackend.py

SettingsBackend.py的内容源自Django官网的文档

1234567891011121314151617181920212223242526272829303132333435from django.conf import settingsfrom django.contrib.auth.models import User, check_password class SettingsBackend(object): """ 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
现在我们可以通过登录admin后台体验下刚刚自定义的用户身份验证功能了:打开浏览器访问:http://127.0.0.1:8000/admin/使用我们预定义的用户名和密码登录,可以先输入错误的,看看提示的错误信息。


然后输入正确的,登录成功后会看到:


点击用户可以看到由SettingsBackend为我们创建的admin用户:


自定义的用户验证类已经完成了,不过在现实中一般除了admin后台,前台也会有APP需要进行身份验证,所以最后我们快速建立一个最简单的APP应用下刚才自定义的身份验证功能。再建立一个APP,名称为’myapp’:

1

$
python
manage.py
startapp
myapp

修改url配置:

1$ vi test_auth/urls.py
增加如下一行:

1

url(r'^$',
'myapp.views.home',
name='home'),

编加views.py:

1$ vi myapp/views.py
输出内容是本博客的网址,这里为了看验证功能,对视图函数加上’@login_required’修饰指令,要求访问它时必需进行身份验证:

1

2

3

4

5

6

7

from
django.http
import
HttpResponse

from
django.contrib.auth.decorators
import
login_required

# Create
your views here.

@login_required

def
home(request):

return
HttpResponse('<h1>blog.objcc.com</h1>')

还要在settings.py 的INSTALLED_APPS中加上 ‘myapp’:

1$ vi test_auth/settings.py
加上 ‘myapp’:

1

2

3

4

5

INSTALLED_APPS =
(

...

'myauth',

'myapp',

)

下面打开浏览器访问 http://127.0.0.1:8000 如果刚才你没有在admin退出登录的话,可以看到正常的页面内容:



如果在admin后台 http://127.0.0.1:8000/admin/ 点退出:





然后再访问 http://127.0.0.1:8000 会看到如下错误页面:




http://127.0.0.1:8000/accounts/login/?next=/ 跳转到这个页面是因为由于用户没有登录,验证失败时Django会默认跳转到“setting.LOGIN_URL”定义的链接,这说明我们上面的验证是有效的。

关于详细的说明请访问官方网站:

Customizing
authentication in Django

以上全部源码可免费得到:

https://github.com/objcc/CustAuthTutorial

获取更多干货还可关注微信公号’python-django’及新浪微博@suwei76

3,811 total views, 2 views today

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐