• django 认证系统--2


    使用django的认证系统

    User 对象

     User是认证系统的核心。典型代表是用户和你的站点进行交互还有限制访问、注册用户等等。django认证框架中,只存在一个User类,像'superuser'和'staff'等等都是User的对象,只是某些属性不一样而已。

    class User(AbstractUser):
        """
        Users within the Django authentication system are represented by this
        model.
    
        Username, password and email are required. Other fields are optional.
        """
        class Meta(AbstractUser.Meta):
            swappable = 'AUTH_USER_MODEL'

    User继承自一个抽象基类,提供了User模块所有的功能

    class AbstractUser(AbstractBaseUser, PermissionsMixin):
        """
        An abstract base class implementing a fully featured User model with
        admin-compliant permissions.
    
        Username and password are required. Other fields are optional.
        """
        username = models.CharField(
            _('username'),
            max_length=30,
            unique=True,
            help_text=_('Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.'),
            validators=[
                validators.RegexValidator(
                    r'^[w.@+-]+$',
                    _('Enter a valid username. This value may contain only '
                      'letters, numbers ' 'and @/./+/-/_ characters.')
                ),
            ],
            error_messages={
                'unique': _("A user with that username already exists."),
            },
        )
        first_name = models.CharField(_('first name'), max_length=30, blank=True)
        last_name = models.CharField(_('last name'), max_length=30, blank=True)
        email = models.EmailField(_('email address'), blank=True)
        is_staff = models.BooleanField(
            _('staff status'),
            default=False,
            help_text=_('Designates whether the user can log into this admin site.'),
        )
        is_active = models.BooleanField(
            _('active'),
            default=True,
            help_text=_(
                'Designates whether this user should be treated as active. '
                'Unselect this instead of deleting accounts.'
            ),
        )
        date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
    
        objects = UserManager()
    
        USERNAME_FIELD = 'username'
        REQUIRED_FIELDS = ['email']
    
        class Meta:
            verbose_name = _('user')
            verbose_name_plural = _('users')
            abstract = True
    
        def get_full_name(self):
            """
            Returns the first_name plus the last_name, with a space in between.
            """
            full_name = '%s %s' % (self.first_name, self.last_name)
            return full_name.strip()
    
        def get_short_name(self):
            "Returns the short name for the user."
            return self.first_name
    
        def email_user(self, subject, message, from_email=None, **kwargs):
            """
            Sends an email to this User.
            """
            send_mail(subject, message, from_email, [self.email], **kwargs)
    View Code

    API 

    默认的用户类字段有如下:

    username  最多三十个字符

    first_name

    last_name

    email

    password

    group

    user_permissions

    is_staff  布尔值,用户能否访问管理后台页面

    is_active  布尔值。它的作用并不是用来决定某用户是否有权限访问网站,而是用在其他地方:如匿名用户默认就被设置为了 is_active = False

    is_superuser 布尔值 是否是超级用户

    last_login  最后一次登录时间(1.8+如果用户从来没有登陆过,那么该字段将被置为null之前都是置为当前时间)

    date_joined 用户创建时间

    方法:

    get_username() 使用这个方法返回用户名,而不是直接引用User的username属性

    is_anonymous 登录用户总是返回False  是否是匿名用户

    is_authenticated 登录用户总是返回True 用户是否经过验证。不代表任何权限也不检查用户是否活跃或者是是否拥有一个回话。 当你检测该用户是否已经登录时可以使用该方法

    get_full_name()  获得全名 first_name last_name

    get_short_name() 返回first_name

    set_password(raw_passwrod) 设置用户密码,不保存User 对象。当raw_password为空时,它做的和set_unusable_password()一样

    set_unusable_password()  标记用户没有设置密码,这和设置了一个空字符密码的情形不一样,check_password()在检查这个用户是将永远不会返回True。你用其他的认证源的时候,可以使用这个方法。

    check_password(raw_password) 检查密码,如果密码正确返回True

    has_usable_password()  如果set_unusable_password()被调用之后,该方法返回False
    get_group_permissions(obj=None) 返回用户所在组所拥有的权限。如果传入了参数,那么只返回该组的权限。一个字符串组成的集合。

    get_all_permissions(obj=Noe) 返回用户所有的权限,包括自己本身的权限和所在组的权限。如果传入特定参数,那么只返回该组的权限。一个字符串集合

    has_perms(perm,obj=None) 如果用户有指定权限,那么就返回True。如果用户被设置为了inactive,那么该方法永远返回False。默认是检查用户对某个model

    的权限,如果传入和指定的obj那么只检查用户对该obj是否有权限。

    has_module_perms(package_name)  只要用户对某APP有任何的权限,那么返回True。同样,如果用户被设置了inactive,那么永远返回False

    email_user(subject,message,from_email=None,**kwargs) 发送邮件。from_email如果没有指定那么django使用DEFAULT_FROM_EMAIL指定的用户

    Manger(每个model一个默认的manager,默认名为:objects) 

    方法:

    create_user(username,email=None,password=None,**extra_fields)

    创建、保存并返回一个User对象

    from django.contrib.auth.models import User
    >>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

    如果配置了用户名和密码,那么该用户的is_active=True,如果没有设置password那么将会调用set_unusable_password,用户将被置为is_active=False(猜测,待验证)

    **extra_fields 用于自定义User模型。是User的__init__参数

    create_superuser(username,email,password,**extra_fields) 创建超级用户

    python  manage.py changepassword username
    #更改指定用户密码,如果未指定用户,更改当前系统用户的密码,注意:该系统用户名可能不存在在该project中。例如:如果不提供用户名,会修改我电脑用户名的账户密码,提示错如:CommendError:user 'an' does not exist

    >>> from django.contrib.auth.models import User
    >>> u = User.objects.get(username='john')
    >>> u.set_password('new password')
    >>> u.save()
    如果启用了SessionAuthenticationMiddleware,那么更改密码,会退出该用户的所有用户回话。

    authenticate()

    验证用户名和密码,如果成功返回一个 User 对象,否则返回 None

    User对象有两个ManyToManyField,分别是:groups和user_permissions

    myuser.groups = [group_list]
    myuser.groups.add(group, group, ...)
    myuser.groups.remove(group, group, ...)
    myuser.groups.clear()
    myuser.user_permissions = [permission_list]
    myuser.user_permissions.add(permission, permission, ...)
    myuser.user_permissions.remove(permission, permission, ...)
    myuser.user_permissions.clear()
    View Code

    AnonymouseUser匿名用户

    django.contrib.auth.models.AnonymouseUser 

    id 总是None

    username 总是 空字符串

    get_username 总是返回空字符串

    is_staff 和is_superuser 总是返回False

    is_active 总是返回False

    groups和user_permissions总是空的

    is_anonymous 返回True (User返回False)

    is_authenticated 返回False (User返回Ture)

    set_password(),check_password,save(),delete()引发NotImplementedError.错误

  • 相关阅读:
    js判断是否是合法的端口号
    解决tomcat中文乱码
    使用java代码删除nexus maven仓库中的jar包、pom.xml等组件
    基于 Kubernetes 构建企业 Jenkins 持续集成平台
    minio部署
    elaticsearch 部署
    skywalking 8.0 配置文件
    使用node local dns来提升ClusterDNS服务质量
    kubernetes之监控Operator部署Prometheus
    夜莺监控+prometheus 架构图
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/5846264.html
Copyright © 2020-2023  润新知