`
maplye
  • 浏览: 114587 次
  • 来自: ...
社区版块
存档分类
最新评论

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

阅读更多

此文是总结Django官方网站里面的Document的文章 User authentication in Django
http://www.djangoproject.com/documentation/authentication/


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

这些从字面上也都很好的理解,但是我对消息(Messages)还不是很理解…………


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

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

这是Django自带的User的基本的信息,如果你要使用该权限模块,就必须要使用他的User类,
但是通常情况下,我们的用户信息还会有其他的属性,这时我们可以再增加一类来扩展,该类和User的关系是OneToOne。
如:
#这是china-django中的代码

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

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


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


3、User的验证
1)登陆(Login)

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

4、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 %}

5、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

这个时候我们需要修改Setting
AUTHENTICATION_BACKENDS = (
 'sputnik.backends.ldapBackend.LDAPBackend',
)

这里还有一片关于Authentication Backends的文章

LDAP Authentication in Django with Backends

全文结束,谈不上总结,因为缺少我的体会和心得,也谈不上翻译,因为my englishi is Poor.

See You!!!

 

 

分享到:
评论
1 楼 viking2439 2012-06-19  
有没有方法去指定用户去获得某个权限呢?

相关推荐

    基于django的RBAC权限控制模块

    在这个权限控制模块中,编写了一个中间件,它的作用是在每个请求处理前检查用户是否有执行相应操作的权限。如果用户无权访问,中间件将阻止请求的进一步处理。 3. **权限分配**:在后台管理系统中,管理员可以为...

    基于Django开发的通用系统权限模块(RABC)--里面提供源码下载

    ### 基于Django开发的通用系统权限模块(RABC) #### 一、系统概述 本系统基于Django框架构建,旨在为开发者提供一套快速搭建应用系统的解决方案,特别是针对那些需要灵活权限管理的应用场景。该系统不仅仅适用于...

    基于django的RBAC权限管理控制模块

    在这个模块中,中间件用于在用户请求时检查其权限,如果权限不足,则阻止相应操作。 **实现细节** 1. **模型(Model)**: 模块可能包含自定义的`Role`、`Permission`和`UserRole`模型,其中`UserRole`用于存储用户...

    django实现用户的登录注册连接后台数据库完成主页的搭建

    2. 用户认证系统:Django内置了用户认证系统,包括用户模型、权限管理、会话管理等。在这里,我们将利用Django的`User`模型创建用户注册表单,处理用户注册、登录的业务逻辑。注册时,用户信息会被存储到数据库中;...

    学生信息管理系统django模块代码

    **学生信息管理系统django模块代码详解** 在Python的世界中,Django是一个强大且高效的Web框架,它使得开发者能够快速地构建高质量的web应用。本项目是一个基于Django开发的学生信息管理系统,旨在实现对学校中学生...

    Python Django Web典型模块开发实战_用Django REST framework实现豆瓣API应用项目.pdf

    **Python Django Web典型模块开发实战** - 这个主题涵盖了使用Python的Django框架进行Web应用开发的实践项目。Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。通过使用Django,开发者可以...

    django笔记 django笔记

    Django内置了用户认证和授权系统,包括用户模型、登录/注销、权限和组的管理。通过`django.contrib.auth`模块,可以轻松实现用户注册、登录验证等功能。 10. **静态文件与媒体文件**: Django处理静态文件(如CSS...

    python-Django实现用户登录

    这个模块提供了用户管理、权限和组的基础设施,使得创建用户登录功能变得非常简单。在`第18周-第11章节-Python3.5-Django的Model使用.avi`中,可能涵盖了如何定义模型(Models)以及如何利用Django的内置User模型。...

    python Django web 实训项目的实验报告

    总结来说,本实训项目不仅涵盖了Django的基础使用,还涉及到Web开发中的常见问题和解决方案,如数据安全、页面交互、数据可视化和性能优化,为开发者提供了全面的实践平台。通过这样的项目,学生能够提升自己的...

    Django的用户模块与权限系统的示例代码

    一 导言 设计一个好的用户系统往往不是...如配置了Django的用户系统,仅需调用Django提供的几个函数,便可实现用户的登录,注销,权限验证等功能。例如以下情景 1.登录 # some_view.py from django.contrib.auth impo

    Django_layui后台模板

    - 自定义权限控制:Django提供了强大的权限和认证系统,可以与Django_layui结合,实现后台的权限分配和角色管理。 - 表单处理:使用Django的表单类,结合Layui的表单组件,可以方便地处理前端提交的数据。 - ...

    Django.zip

    10. 表单处理:Django的表单处理模块简化了数据验证和用户输入处理。在CRUD操作中,通常会使用表单来收集用户输入,然后进行数据验证和存储。 这个项目展示了Django的强大功能以及如何结合Ajax技术提升web应用的...

    django简易版网盘

    这通常涉及到`django.contrib.auth`模块的使用,包括创建用户、验证用户凭证、管理用户会话等。 2. **文件上传**:在Django中,文件上传主要通过`django.core.files`和`django.db.models.FileField`实现。开发者...

    Django REST framework讲义PDF全集,中文文档PDF版

    权限管理是控制用户访问API资源的关键。DRF内置了一些基本权限类,如IsAuthenticatedOrReadOnly,同时允许开发者自定义权限类,以满足特定场景的需求。 六、分页与过滤 DRF支持多种分页方案,如...

    Apache中部署Django

    接下来,在Apache的配置文件中,需要指定Django应用的具体位置以及相关媒体文件的访问权限。例如: ```apache # 在Apache_HOME/conf/extra下创建httpd-django.conf LoadModule python_module modules/mod_python.so...

    利用Django学习并开发的小说网源码.zip

    每个应用都是Django项目中的独立模块,可以处理特定的功能,如用户认证、新闻发布或在这个例子中,小说管理。 3. **Django模型(Model)** `models.py` 文件定义了数据库中的表结构。在小说网项目中,可能包含如`...

    django基础教程

    2. **应用**:应用是项目中的独立模块,专注于特定功能,如用户认证、博客管理等。每个应用都有自己的模型、视图、模板和URL配置。 四、Django模型 模型(Model)是数据库的抽象表示,用于定义数据结构和字段。...

    Django个人博客系统 课件

    【Django个人博客系统 课件】 Django是一款强大的、基于Python的Web开发框架,它遵循MVC...从安装Django、创建项目和应用,到实现完整的功能模块,你将深入理解Django框架的精髓,并具备独立开发Web应用的能力。

    django增删改查模块

    在IT行业中,Django是一个非常流行的Python web框架,它提供了高效、可扩展的Web开发解决方案。本教程将深入探讨如何在Django中实现数据库记录的前端增删改查(CRUD)操作,这对于任何Web应用来说都是核心功能。 ...

Global site tag (gtag.js) - Google Analytics