如何利用Django-auth做用户认证

现在又个新的需求,我们不想用django-admin自带的登陆页面,自己写一个如何呢?但是如何利用Django-auth来验证用户呢?因为Django auth验证用户更为严谨,如果你对自己自信,也可以自己写,当然我们这里还是用Django auth来做验证和存储用户。

首先,让我们开始创建项目和APP,前面我也很详细的说明了如何创建项目和APP。

创建数据库,和相关用户的权限。

root@CD-FTP-VPN:/opt/jastme# tree
.
|-- jastme
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- settings.py
|   |-- settings.pyc
|   |-- urls.py
|   |-- urls.pyc
|   |-- wsgi.py
|   `-- wsgi.pyc
|-- login
|   |-- admin.py
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- models.py
|   |-- models.pyc
|   |-- tests.py
|   |-- views.py
|   `-- views.pyc
|-- manage.py
`-- start.sh

2 directories, 18 files
root@CD-FTP-VPN:/opt/jastme#

使用python manage.py syncdb 来创建一个叫jastme,密码为jastme的超级用户。我们可以用Django-admin来管理这些用户。

首先看看setting.py

root@CD-FTP-VPN:/opt/jastme# more jastme/settings.py

"""
Django settings for jastme project.

For more information on this file, see
https://docs.djangoproject.com/en/1.7/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.7/ref/settings/
"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'r!1=i^3qhwglr(zf*9&n*ii!b_oy2h()ics(6(de3wuo0-oh8h'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

TEMPLATE_DEBUG = True

ALLOWED_HOSTS = []


# Application definition
INSTALLED_APPS = (
#    'django.contrib.admin',                               #注释掉admin
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'login',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
#    'django.middleware.csrf.CsrfViewMiddleware',                                #这个中间件是防止跨站攻击的。有意思的朋友可以去搜索下。
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'jastme.urls'

WSGI_APPLICATION = 'jastme.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases

DATABASES = {                                   #数据库的相关配置
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'jastme',
        'USER':'jastme',
        'PASSWORD':'jastme',
        'HOST':'localhost',
        'PORT':'3306',
    }
}

# Internationalization
# https://docs.djangoproject.com/en/1.7/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.7/howto/static-files/

STATIC_URL = '/static/'

TEMPLATE_DIRS =(                                       #模板的路径
                '/var/www/jastme/',
)

views.py

root@CD-FTP-VPN:/opt/jastme# more login/views.py
from django.shortcuts import render
from django.contrib import auth
# Create your views here.
from django.shortcuts import render_to_response
from django.contrib.auth import authenticate, login
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse,HttpResponseRedirect
from django.contrib.auth.decorators import login_required


def my_login(request):                                #我们自定义一个函数,这个函数名字一定不要写成login,因为Django有有login模块。
    if request.method == 'POST':                      #我们使用POST的方法来获取从HTML传递过来的表单内容
        username = request.POST['username']           #获取账号和密码
        password = request.POST['password']
        user = authenticate(username=username, password=password)            #我们用user来实例化 authenticate(username=username, password=password)
        if user is not None:                     #用户名不为空
            if user.is_active:                   #为激活用户
                login(request, user)             #调用django.contrib.auth中的login函数,可以具体去看看源码
                return HttpResponseRedirect('/main')         #登陆成功就重定向到主页
        else:
            login_error = 'login error.'
            return render_to_response('login.html', {'login_error' : login_error, 'is_display' : 'display:block'})          #失败则返回登陆页面
    return render_to_response('login.html', {'is_display' : 'display:none'})    #同理

@login_required                       #调用了这个修饰器,就可以让这个页面在成功登陆后才能访问
def main(request):
    return HttpResponse('login sucess')          #直接返回这个字符串

再看看urls.py

root@CD-FTP-VPN:/opt/jastme# more jastme/urls.py
from django.conf.urls import patterns, include, url
#from django.contrib import admin
from login.views import my_login,main                           #这里是我们导入的项目中的views.py中的模块,就是我们自己写的函数
#from django.contrib.auth.views import login, logout

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'jastme.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

#    url(r'^admin/', include(admin.site.urls)),
    (r'^main/$',main),
    (r'^login/$',my_login),

)

login.html

root@CD-FTP-VPN:/var/www/jastme# pwd
/var/www/jastme
root@CD-FTP-VPN:/var/www/jastme# ls
login.html

<form action="" method="POST">                  #在此页面以POST的方式来提交参数
<input type=text name="username">
<input type=text name="password">
<input type=submit value="send">
</form>

让我们来看看效果

205633_qYvl_1790313.jpg

输入用户名jastme,jastme 点击send

205830_S0W5_1790313.jpg

用户认证成功后直接跳转到了main,失败的话就会停留在登陆页面。



转载于:https://my.oschina.net/jastme/blog/343206

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中,可以使用django-admin来创建自定义的RBAC认证系统。以下是一些步骤: 1. 创建一个新的Django应用程序: ``` python manage.py startapp rbac ``` 2. 在rbac应用程序中创建一个新的文件夹,命名为“rbac”。 3. 在rbac文件夹中创建一个新的文件,命名为“middleware.py”。 4. 在middleware.py中编写一个自定义的认证中间件类,可以参考下面的示例代码: ``` from django.contrib.auth.models import User class RbacMiddleware(object): def process_request(self, request): user = request.user if user.is_authenticated(): user_role = user.groups.first() if user_role: permissions = user_role.permissions.all() request.user_permissions = [p.codename for p in permissions] ``` 该中间件类的作用是在请求处理之前对用户进行认证,并将该用户的权限列表存储在请求对象中。 5. 在settings.py中配置中间件: ``` MIDDLEWARE_CLASSES = ( # ... 'rbac.middleware.RbacMiddleware', # ... ) ``` 6. 创建一个新的文件夹,命名为“rbac_templates”。 7. 在rbac_templates文件夹中创建一个新的文件,命名为“base.html”。 8. 在base.html中编写一个自定义的RBAC模板标签,可以参考下面的示例代码: ``` {% if perms.app_label.permission_name %} <!-- Display some content here --> {% endif %} ``` 该模板标签的作用是根据用户的权限列表显示或隐藏特定的内容。 9. 在需要进行RBAC认证的视图函数中使用模板标签,例如: ``` def my_view(request): return render(request, 'my_template.html', {}) ``` 10. 在my_template.html中使用自定义的RBAC模板标签: ``` {% extends 'rbac_templates/base.html' %} {% block content %} {% if perms.app_label.permission_name %} <h1>Welcome to my page!</h1> {% else %} <p>You do not have permission to view this page.</p> {% endif %} {% endblock %} ``` 以上就是使用django-admin自定义RBAC认证的一些步骤。需要注意的是,这只是一个简单的示例,实际情况可能更加复杂,需要根据具体的应用场景进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值