zoukankan      html  css  js  c++  java
  • django 从零开始 8 用户登录验证 待测

    看文档 djang 自带一个用户登录验证的方法,不过有些看着懵逼,去网上找了一圈,发现很多都是照抄文档说明的,几乎没说啥原理

    特别是 

    from django.contrib.auth import authenticate

    都说这个方法是,不过貌似文档中说的是使用django自带的模型可以对用户登录做一个验证,

    但是业务需求不需要,不可能使用django的user模型 

    from django.contrib.auth.models import User 
    
    
    # 这是django的验证模型,继承自 AbstractBaseUser, PermissionsMixin
    # from django.contrib.auth.models import AbstractUser  这是自定义模型可以使用request.user 的继承类  注意  
     https://docs.djangoproject.com/zh-hans/2.2/topics/auth/customizing/ 
    
    # 查看源码可知 class User(AbstractUser): """ Users within the Django authentication system are represented by this model. Username and password are required. Other fields are optional. """ class Meta(AbstractUser.Meta): swappable = 'AUTH_USER_MODEL' settings 中设置 AUTH_USER_MODEL 指向那个模型验证

    通常都是自定义

    所以自定义一个用户模型

    class User(models.Model,AbstractBaseUser): # 想了想貌似需要继承AbstractBaseUser 当进行密码保存时也会进行一个加密 其中username和password 必须拥有
    class Meta: 
      db_table
    = 'user'

    username
    = models.CharField(max_length=20,null=True,unique=True)
    password
    = models.CharField(max_length=128)
    create_date
    = models.DateTimeField(auto_now_add=True)

    # 注意 需要添加两个字段 不然进行服务器启动时会出现 AttributeError: type object 'User' has no attribute 'USERNAME_FIELD' 错误
    # 如果继承了 AbstractBaseUser 则需要使用这两字段
    identifier = models.CharField(max_length=40, unique=True)
    USERNAME_FIELD = 'identifier'

    ps:需要看这文章 https://www.cnblogs.com/zhanghongfeng/p/8331493.html

    要有usernam和password两个属性

    同时在sessting中指定用户登录验证模型是哪一个,不指定则会使用django默认的用户登录验证表去进行一个验证...  没有在这个模型存入,玩个锤子验证哦

    AUTH_USER_MODEL = 'user.User'  # app名字.表名字

    不过 貌似django也自带一个session会话保存数据库表... (分布式需要把?)

    只要进行了登录验证 也会保存在django_session表中,貌似可以在settings中可以关掉,但是不会到过期时间自动清除(默认30天),而是一直保存在表中

    from django.contrib.auth import authenticate,login
    def login_auth(request):
    
        # 如果用户登录还想再次访问login,验证cookes中含有is_login字段则将返回index页面
        if request.COOKIES.get('is_login'):
         # if
    request.user.request.user.is_authenticated:
          return redirect(reverse('user:index')) 

       if request.POST.method == 'POST': # 在前端页面自己写一个loginform登录框
           username = request.POST.get('username')
           password
    = request.POST.get('password')
    # 会往指定模型中寻找含有该字段的数据数据,如果存在该实例 继续往下
           user = authenticate(username=username,password=password) # 如果使用其他字段也行,比如你模型中用有email验证 那么改为 (email=email,...) 不强求
          
    if user:
             
    # from django.contrib.auth.decorators import login_required
             # 看源码可知 将查询到的用户实例的 pk (id) 加入session中 使用login_required 来判断是否为登录用户
           # 还可以使用 request.user.is_authenticated 查看登录用户其他属性
             login(request,user)
             
             #
    防止登录用户进入 或者不设置 使用request.user.request.user.is_authenticated 确定是否为登录用户 上面确定cookies也注释掉
             request.COOKIES['is_login'] = True # 得到cookies之前进行跳转登录前的页面
             # 或者有些页面需要登录才能查看,那么在进行跳转时在url中加入 当前视图url request.path 得到当前视图url
             # https://docs.djangoproject.com/zh-hans/2.2/topics/auth/default/
             #
    return redirect('%s?next=%s' % (login, request.path)
                  next = request.COOKIES.get('next')
                  if next:
                      return redirect(reverse(next))
    
                return redirect(reverse('user:index'))
    
        return render(request,'user/login.html')

    其中源码还对request.user 进行了一个属性设置 可以用request.user.is_authenticated 对其该用户验证为登录用户,html模板中也能使用???

    是一个用户实例????

    https://segmentfault.com/q/1010000004663650 看

    指定的模型除了 验证还能得到该的属性???

    退出使用logout

    from django.contrib.auth import logout
    
    def logout(request):
        logout(request)
        return redirect(reverse("user:index"))

    对用户登录视图验证

    from django.contrib.auth.decorators import login_required
    @login_required
    def xxx():
        pass

    如果不想这种办法也不想将session保存在数据库中,将login替换

    可以将用户一些不太重要的数据以字符串字典

    request.COOKES['user']="user_id:%s" user.id

    保存在cookies中(用户名或者id主键), 使用可逆推加密算法进行一个加密

    如果用户请求,进行一个解密,如果含有user字段,并该字段中含有user_id

    user = request.COOKES.get('user')
    if user:
        # 进行你的解密得到记过 user的values值
      ...
    if 'user_id' in values: # 确定是登陆用户 请继续往下操作 else: ....

    引用

     https://www.cnblogs.com/guoguojj/p/8607951.html

    https://www.cnblogs.com/zhanghongfeng/p/8331493.html

  • 相关阅读:
    深入浅出 Java Concurrency (4): 原子操作 part 3 指令重排序与happens-before法则
    深入浅出 Java Concurrency (3): 原子操作 part 2
    深入浅出 Java Concurrency (2): 原子操作 part 1
    深入浅出 Java Concurrency (1) : J.U.C的整体认识
    java中关键字volatile的作用
    教你如何迅速秒杀掉:99%的海量数据处理面试题(转)
    STL容器介绍(转)
    IoC框架
    LeetCode 548. Split Array with Equal Sum (分割数组使得子数组的和都相同)$
    LeetCode 533. Lonely Pixel II (孤独的像素之二) $
  • 原文地址:https://www.cnblogs.com/zengxm/p/11316074.html
Copyright © 2011-2022 走看看