美文网首页
【Django】会话、用户和认证

【Django】会话、用户和认证

作者: 小蜗牛的成长 | 来源:发表于2019-01-22 15:04 被阅读0次

本章着重总结Django的用户与认证

一. cookies

    http(s)本身是无状态的,当前请求和下次请求之前无任何状态保持,为了存储状态,首先应运而生的是cookies。在Django中,每个request都包含了一个COOKIES对象,可以像字典一样使用它。
    虽然cookies能解决了状态保持问题,但是引出了其他问题:
        a. 浏览器不保证会存储,是否接受cookies在浏览器端用户可以控制;
        b. cookies在浏览器中是可清除的,不可存储重要信息,否则可能发生不可恢复的问题;
        c. http是明文传输,因此中间人容易拦截获取cookies并使用,不安全,容易被篡改;

二. session

    为了解决cookies所带来的问题,session(会话)已然成为了web开发青睐的手段。在Django中,自带session框架解决了这个需求,存取每个用户的任意数据,该数据可存储在服务器端或者以文件等方式存储。

    在Django中,sessions 功能是通过一个中间件(middleware)和一个模型(model)来实现的,为了使用session功能,需要确认以下(默认情况是打开):
       a. 确认MIDDLEWARE(中间件) django.contrib.sessions.middleware.SessionMiddleware被添加在MIDDLEWARE
       b. 确认 session app(系统) django.contrib.sessions被添加在INSTALLED_APPS
   激活后,每个httpRequest都有一个session属性,是一个字典对象,每个session对象都是由一个随机的32位哈希串来标识

    由于session是依赖cookies来设计的,session的有效期等需要进行一些设置,比如关闭浏览器失效还是有效期一个星期失效等,常用的如下:
        1. SESSION_ENGINE 设置引擎,决定session保存在哪里,默认数据库
        2. SESSION_COOKIE_NAME Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
        3. SESSION_COOKIE_PATH 保存的路径
        4. SESSION_COOKIE_DOMAIN 保存的域名
        5. SESSION_COOKIE_SECURE 是否https传输cookie
        6. SESSION_COOKIE_AGE cookie的有效期
        7. SESSION_EXPIRE_AT_BROWSER_CLOSE 是否关闭浏览器就失效
        8. SESSION_SAVE_EVERY_REQUEST 是否每次请求都保存Session,默认修改之后才保存

三. 用户、认证与授权

    auth模块(app)是Django提供的标准认证与授权系统,主要做2件事:
       a. 认证用户,主要比对系统中是否存在该用户
       b. 检查权限,主要确定用户是否有某些操作,即被授权某些操作
    默认情况,应用到的中间件django.contrib.auth.middleware.AuthenticationMiddleware 和app 系统django.contrib.auth是打开的。User模型是auth模块中维护的用户信息关系模型。主要字段用户名、密码、邮箱等,可在auth/models.py中查看具体,继承关系如下
      User----继承----> AbstractUser---->AbstractBaseUser和PermissionsMixin
    其中AbstractBaseUser定义了对象字段和操作数据表的API,PermissionsMixin定义了权限相关内容
    本次建系统的过程中,用户内置的User不够满足需求,采用了扩展AbstractUser的方式,怎么创建适合的User模型得看需求,这篇文章已经说得很清楚,可参考:http://www.cnblogs.com/yxi-liu/p/8684504.html

    用户的认证
      authenticate(),通过用户名称和密码进行用户的认证
      login(request, user),该函数接受一个 HttpRequest 对象和一个 User 对象作为参数并使用Django的会话( session )框架把用户的ID保存在该会话中
      logout(),实际就是清除了session中的user信息,它接受一个HttpRequest对象并且没有返回值,所以,因为没有返回值,需要返回一个页面。

from django.contrib.auth import login,logout,authenticate
user=authenticate(username=userName, password=password)
    if user is not None and user.is_active:
            login(request, user)#认证通过后,调用login方法,主要是设置session



    说完了用户的问题,接下来说说权限与组
    使用auth 原生或扩展的User,执行完migratemakemigrations,即python3 manage.py migrate auth``python3 manage.py makemigrations auth后,会在数据库中生成3个表
        auth_group:组,包括id和name
        auth_group_permission: 组权限,包括id、group_id、permission_id
        auth_permission: 权限信息,包括name、content_type_id和codename字段,codename主要是使用权限方法传入的参数,content_type_id与模型相关
    permission总是与model对应的,如果一个object不是model的实例,我们无法为它创建

    在创建model时,可通过元类的方式自定义权限

class Meta:
    permissions =
              (
                    ("view_server", "can view server"),//(codename,name)
                    ("change_server_status", "Can change the status of server"),
              )

    或者通过脚本的方式设置权限

#假设model为blog,app为blogs
from django.contrib.contenttypes.models import  ContentType
from django.contrib.auth.models import Permission
content_type=ContentType.objects.get_for_model(blog) 
permissions=Permission.objects.create(codename="can_edit_blog",name="edit blog ",content_type=content_type)
#以上权限可通过user_permissions或permission属性的Groups分配给一个User对象
user.user_permissions.add(permissions)
group=Group.objects.get(name='only_view_person')
user.groups.add(group)
#以上只是举例为用户添加权限,其他方法有clear()、set()、remove()

    验证权限

user.has_perm('blogs.can_edit_blog')#或者使用装饰器@permission_required("blogs.can_edit_blog")装饰函数
#页面验证权限
{%if perms.blogs.can_edit_blog%}

相关文章

网友评论

      本文标题:【Django】会话、用户和认证

      本文链接:https://www.haomeiwen.com/subject/xmogrqtx.html