zoukankan      html  css  js  c++  java
  • django(权限、认证)系统——User模型

    在Django的世界中,在权限管理中有内置的Authentication系统。用来管理帐户,组,和许可。还有基于cookie的用户session。这篇blog主要用来探讨这套内置的Authentication系统。

     Django内置的权限系统包括以下三个部分:

    1. 用户(Users)
    2. 许可(Permissions):用来定义一个用户(user)是否能够做某项任务(task)
    3. 组(Groups):一种可以批量分配许可到多个用户的通用方式

    首先需要在Django中安装这个组件:

    1. 将'django.contrib.auth'和'django.contrib.contenttypes'放到settings.py中的INSTALLED_APPS中。(使用contenttypes的原因是auth中的Permission模型依赖于contenttypes)
    2. 执行manage.py syncdb

    装好了就可以开始使用了;我们可以执行manage.py shell来启动脚本,对其中的一些API进行学习和使用。

    首先最重要的开始就是User模型

    User模型对应于一个用户,一个帐户,位于'django.contrib.auth.models'模块中。

    User对象有两个多对多的属性分别是:groups和user_permissions:

    >>>from django.contrib.auth.models import User
    >>>es = User.objects.create_user('esperyong','esperyong@gmail.com','123456')
    >>>es.groups
    <django.db.models.fields.related.ManyRelatedManager at 0x10d0642d0>
    >>>es.user_permissions
    <django.db.models.fields.related.ManyRelatedManager at 0x10d014c50>
    1. 直接将一个列表赋值给该属性:
      es.groups = [group_list]
      es.user_permissions = [permission_list]
    2. 使用add方法将对象加入:
      es.groups.add(group, group, ...)
      es.user_permissions.add(permission, permission, ...)
    3. 使用remove方法将对象删除:
      es.groups.remove(group, group, ...)
      es.user_permissions.remove(permission, permission, ...)
    4. 使用clear方法将所有对象删除:
      es.groups.clear()
      es.user_permissions.clear()

        

    User对象有以下几个属性:

    1. username:字符串类型。必填。30个字符以内。
    2. first_name:字符串类型。可选。30个字符以内。
    3. last_name:字符串类型。可选。30个字符以内。
    4. email:可选。
    5. password:明文密码的hash或者是某种元数据。该属性不应该直接赋值明文密码,而应该通过set_password()方法进行赋值,在后面有详细说明TODO。
    6. is_staff:Boolean类型。用这个来判断是否用户可以登录进入admin site。
    7. is_active:Boolean类型。用来判断该用户是否是可用激活状态。在删除一个帐户的时候,可以选择将这个属性置为False,而不是真正删除。这样如果应用有外键引用到这个用户,外键就不会被破坏。
    8. is_superuser:Boolean类型。该属性用来表示该用户拥有所有的许可,而无需明确的赋予给他。
    9. last_login:datetime类型。最近一次登陆时间。
    10. date_joined:datetime类型。创建时间。

    除了DjangoModel对象的通用方法之外,User对象有以下特有方法:

    1. is_anonymous():
      永远返回False.用来将User对象和AnonymousUser(未登录的匿名用户)对象作区分用的识别方法。通常,最好用is_authenticated()方法。
    2. is_authenticated():
      永远返回True。该方法不代表该用户有任何的许可,也不代表该用户是active的,而只是表明该用户提供了正确的username和password。
    3. get_full_name():
      返回一个字符串,是first_name和last_name中间加一个空格组成。
    4. set_password(raw_password):
      调用该方法时候传入一个明文密码,该方法会进行hash转换。该方法调用之后并不会保存User对象。
    5. check_password(raw_password):
      如果传入的明文密码是正确的返回True。该方法和set_password是一对,也会考虑hash转换。
    6. set_unusable_password():
      将用户设置为没有密码的状态。调用该方法后,check_password()方法将会永远返回false。但是如果,调用set_password()方法重新设置密码后,该方法将会失效,has_usable_password()也会返回True。
    7. has_usable_password():
      在调用set_unusable_password()方法之后,该方法返回False,正常情况下返回True。
    8. get_group_permissions(obj=None):
      返回该用户通过组所拥有的许可(字符串列表每一个代表一个许可)。obj如果指定,将会返回关于该对象的许可,而不是模型。
    9. get_all_permissions(obj=None):
      返回该用户所拥有的所有的许可,包括通过组的和通过用户赋予的许可。
    10. has_perm(perm,obj=None):
      如果用户有传入的perm,则返回True。perm可以是一个格式为:'<app label>.<permission codename>'的字符串。如果User对象为inactive,该方法永远返回False。和前面一样,如果传入obj,则判断该用户对于这个对象是否有这个许可。
    11. has_perms(perm_list,obj=None):
      和has_perm一样,不同的地方是第一个参数是一个perm列表,只有用户拥有传入的每一个perm,返回值才是True。
    12. has_module_perms(package_name):
      传入的是Django app label,按照'<app label>.<permission codename>'格式。当用户拥有该app label下面所有的perm时,返回值为True。如果用户为inactive,返回值永远为False。
    13. email_user(subject,message,from_email=None):
      发送一封邮件给这个用户,依靠的当然是该用户的email属性。如果from_email不提供的话,Django会使用settings中的DEFAULT_FROM_EMAIL发送。
    14. get_profile():
      返回一个和Site相关的profile对象,用来存储额外的用户信息。这个返回值会在另一片博文中详细描述。

     User对象的Manager,UserManager:

    和其他的模型一样,User模型类的objects属性也是一个Manager对象,但是User的Manager对象是自定义的,增加了一些方法:

      1. create_user(username,email=None,password=None):该方法创建保存一个is_active=True的User对象并返回。username不能够为空,否则抛出ValueError异常。email和password都是可选的。email的domain部分会被自动转变为小写。password如果没有提供,则User对象的set_unusable_password()方法将会被调用。
      2. make_random_password(length=10,allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'):该方法返回一个给定长度和允许字符集的密码。其中默认的allowed_chars有一些字符没有,比如i,l等等。
  • 相关阅读:
    Evaluate Reverse Polish Notation(逆波兰表达式)
    PostreSQL linux添加psql 命令
    C#用文件流读取cvs内容并返回DataTable,并把第一行设为列名
    鹅鹅鹅饿饿
    编译器和解释器
    delphi之多线程编程
    Arduino 板子 COM 接口找不到设备
    JS事件冒泡
    vi编辑器的使用(2)
    vi编辑器的使用(1)
  • 原文地址:https://www.cnblogs.com/wangwei916797941/p/7398934.html
Copyright © 2011-2022 走看看