【Django】会话、用户和认证

本章着重总结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%}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 利用HTTP协议向服务器传参的几种途径、响应、Cookie、Session、类视图、中间件 注意: 1>Dja...
    Cestine阅读 1,237评论 0 2
  • 首先要明确,登陆认证也是自己定义的对url的处理,如果一个项目调用了django的Admin,那么在project...
    llicety阅读 3,571评论 0 6
  • 模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。软件设计中通常用耦合度和内聚...
    riverstation阅读 2,058评论 0 8
  • 点我查看本文集的说明及目录。 本项目相关内容包括: 实现过程: CH7 创建在线商店 CH8 管理支付和订单 CH...
    学以致用123阅读 4,864评论 8 9
  • 今天是女儿入小学以来,学校召开的第三次家长会!我再一次如约而至…… 家长会刚开始,班主任就甩出了一个问题...
    李墨儿妈妈阅读 100评论 0 0