zoukankan      html  css  js  c++  java
  • auth模块使用方法

    Auth模块

    如果用auth模块,你就用全套,不是自己写一部分,用别人一部分

    createsuperuser 创建超级用户,这个超级用户可以拥有登陆djangoadmin后台的权限

    Auth模块是Django自带的用户认证模块:

    我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能.

    Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。

    auth模块的功能

    #查询用户
    from django.contrib import auth
    user_obj = auth.authenticate(username=username,password=password) # 必须要用 因为数据库中的密码字段是密文的 而你获取的用户输入的是明文
    #记录用户状态
    auth.login(request,user_obj) # 将用户状态记录到session中
    #判断用户是否登录
    print(request.user.is_authenticated) # 判断用户是否登录 如果是你们用户会返回False
    #用户登录之后 获取用户对象
    print(request.user) # 如果没有执行auth.login那么拿到的是匿名用户
    #校验用户是否登录
    from django.contrib.auth.decorators import login_required
    @login_required(login_url='/xxx/') # 局部配置
    def index(request):
    pass
    
    # 全局配置 settings文件中
    LOGIN_URL = '/xxx/'
    #验证密码是否正确
    request.user.check_password(old_password)
    #修改密码    
    request.user.set_password(new_password)
    request.user.save() # 修改密码的时候 一定要save保存 否则无法生效
    #退出登陆
    auth.logout(request) # request.session.flush()
    #注册用户
    # User.objects.create(username =username,password=password) # 创建用户名的时候 千万不要再使用create 了
    # User.objects.create_user(username =username,password=password) # 创建普通用户
    User.objects.create_superuser(username =username,password=password,email='123@qq.com') # 创建超级用户 邮箱必填
    

    Auth模块常用方法

    from django.contrib import auth
    

    authenticate()

    提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

    如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。

    authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

    用法:

    from django.contrib import auth
    user_obj = auth.authenticate(username=username,password=password)  # 必须要用 因为数据库中的密码字段是密文的 而你获取的用户输入的是明文
    

    login(HttpRequest, user)

    该函数接受一个HttpRequest对象,以及一个经过认证的User对象。

    该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。

    用法:

    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 'invalid login' error message.
        ...
    

    logout(request)

    该函数接受一个HttpRequest对象,无返回值

    当调用该函数时,当前请求的session信息会全部清除.该用户即使没有登录,使用该函数也不会报错

    用法:

    from django.contrib.auth import logout
    
    def logout_view(request):
        logout(request)
        #Redirect to a success page.
    

    is_authenticated()

    用来判断当前请求是否通过了认证

    用法:

    def my_view(request):
        if not request.user.is_authenticated():
            return redirect('%s?next=%s' % (settings.LOGIN_URL,request.path))
    

    login_required()

    auth给我们提供的一个装饰器工具,用来快捷的给某个视图添加登陆校验

    用法:

    from django.contrib.auth.decorators import login_required
    
    @login_required #全局配置法
    def my_view(request):
        pass
    
    from django.contrib.auth.decorators import login_required
    
    @login_required(login_url='/xxx/') #局部配置
    def index(request):
        pass
    

    若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

    如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

    示例:

    LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由(全局配置)
    

    create_user()

    auth提供的一个创建新用户的方法,需要提供必要参数(username,password)等

    用法:

    from django.contrib.auth.models import User
    user=User.objects.creste_user(username='用户名',password='密码',email='邮箱',...)
    

    create_superuser()

    auth提供的一个创建新的超级用户的方法,需要提供必要参数(username,password)等.

    用法:

    from django.contrib.auth.models import User
    user=User.object.create_superuser(username='用户名',password='密码',email='邮箱',...)
    

    check_password(password)

    auth提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码.

    密码正确返回True,否则返回False

    用法:

    ok=user.check_password('密码')
    

    set_password(password)

    auth提供的一个修改密码的方法,接受要设置新密码作为参数

    注意:设置完一定要调用用户对象的save方法

    用法:

    user.set_password(password='')
    user.save()
    
    @login_required
    def set_password(request):
        user = request.user
        err_msg = ''
        if request.method == 'POST':
            old_password = request.POST.get('old_password', '')
            new_password = request.POST.get('new_password', '')
            repeat_password = request.POST.get('repeat_password', '')
            # 检查旧密码是否正确
            if user.check_password(old_password):
                if not new_password:
                    err_msg = '新密码不能为空'
                elif new_password != repeat_password:
                    err_msg = '两次密码不一致'
                else:
                    user.set_password(new_password)
                    user.save()
                    return redirect("/login/")
            else:
                err_msg = '原密码输入错误'
        content = {
            'err_msg': err_msg,
        }
        return render(request, 'set_password.html', content)
    
    #一个修改密码的简单示例
    

    User对象的属性

    User对象属性:username, password

    is_staff : 用户是否拥有网站的管理权限.

    is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。

    扩展默认的auth_user表

    这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊!

    比如,我想要加一个存储用户手机号的字段,怎么办?

    聪明的你可能会想到新建另外一张表然后通过一对一和内置的auth_user表关联,这样虽然能满足要求但是有没有更好的实现方式呢?

    答案是当然有了。

    我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。

    这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了。

    from django.contrib.auth.models import AbstractUser
                # Create your models here.
                # 第一种 使用一对一关系  不考虑
    
                # 第二种方式   使用类的继承
                class Userinfo(AbstractUser):
                    # 千万不要跟原来表中的字段重复 只能创新
                    phone = models.BigIntegerField()
                    avatar = models.CharField(max_length=32)
                
                # 一定要在配置文件中 告诉django
                # 告诉django  orm不再使用auth默认的表  而是使用你自定义的表
                AUTH_USER_MODEL = 'app01.Userinfo'  # '应用名.类名'
    

    注意:

    按上面的方式扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。写法如下:

    # 引用Django自带的User表,继承使用时需要设置
    AUTH_USER_MODEL = "app名.UserInfo"
    

    再次注意:

    一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。

  • 相关阅读:
    poj 1328 Radar Installation (贪心)
    hdu 2037 今年暑假不AC (贪心)
    poj 2965 The Pilots Brothers' refrigerator (dfs)
    poj 1753 Flip Game (dfs)
    hdu 2838 Cow Sorting (树状数组)
    hdu 1058 Humble Numbers (DP)
    hdu 1069 Monkey and Banana (DP)
    hdu 1087 Super Jumping! Jumping! Jumping! (DP)
    必须知道的.NET FrameWork
    使用记事本+CSC编译程序
  • 原文地址:https://www.cnblogs.com/aden668/p/11772559.html
Copyright © 2011-2022 走看看