(20) 인증 인증 모듈

첫째, 인증 모듈은 무엇인가

장고 인증 모듈이 내장되어 사용자 인증 모듈 : 우리는 사이트 사용자의 시스템을 달성하기 위해 웹 사이트를 디자인하는 불가피한 필요성을 개발하고있다. 우리는, 사용자 등록, 사용자 로그인, 사용자 인증을 포함, 달성 로그 오프, 암호 및 기타 기능을 변경해야 할이 시점에서, 우리는 인증을 로그인 자신의 쿠키와 세션을 사용합니다, 정말 아직 귀찮은 일이다.

장고는 궁극적 인 완벽을위한 프레임 워크로, 물론, 이러한 고충 사용자의 생각합니다. 그것은 우리가 우리가 일부를 우리 자신의 테이블뿐만 아니라가되는 것을 발견, 우리는 장고와 모델 테이블을 만들 때까지 데이터베이스 이주 명령을 수행 알고 테이블을 구축하는 명령을하지 않는, 강력한 사용자 인증 시스템 --auth을 구축 아래 장고 테이블에 내장되어 다른 테이블,

사용자 데이터를 저장에 기본 AUTH_USER 테이블에 의해 사용된다 : 먼저이 테이블의 필드를 보면 그것을 가지고

두, 인증 모듈은 수퍼 유저를 생성

여기에 우리가지도를 보면 : 그림의 URL 당신은 우리가 라우팅 층에서, 장고 프로젝트를 생성, 아 아주 익숙하지 않은, 그것은 우리가 관리자를 라우팅에 대한 기본 주소를 생성 도움이 될 것입니다, 나는 당신이 모르는 나는이 관리자에 대한 액세스를 해결하기 위해 노력하지 않아도?

여기에 당신이 이것에 대해 생각하지 않은,이 사용자 및 암호, 어떻게 수행하는 저를 생성하는 방법 나는 실제 페이지에 로그온 할 수 있습니다? 여기에 내가만큼 당신이 따라 해로 할, 당신은 그런 일이 어떻게 알?

1.首先,先去settings里到数据库配置那里,配一个数据库,最好是配一个新的数据库
2.配置完数据库以后千万别忘了去应用名或者是跟项目名同名的文件名下的__init__文件里配置如下两条代码,因为django默认是用sqlite3数据库,所以只要我们自己配置了数据库,就一定要配置这两句
    import pymysql
    pymysql.install_as_mysql()
3.打开菜单栏tools下的tool manage.py Task界面,输入下面的代码
    createsuperuser------创建超级用户
4.看下方图解

이번에는 우리의 슈퍼 사용자가 좋아 등록의 위의 관리자 주소 액세스의 효과를 해보자, 우리가 만든 사용자가 로그인을 사용할 수 없습니다 : 당신이 방문, 놀라게 될 것입니다,하지만 내용 내부 일부는 읽을 수 없습니다

1572511940383

다음은지도에 직접 개념을 발생합니다 장고는, 관리 모델 테이블에 전념 단지 등록 된 사용자는 이제 장고 모델 테이블을 모두 관리 할 수 ​​있지만 우리는 모델 테이블 만 만들지 않았습니다.

그리고 우리가 위에서 언급 한보고 계속보고, 장고는 AUTH_USER 테이블에 저장되어있는 기본 사용자 인증 정보, 어떤 변화 :( 다중 사용자 데이터를 찾아이 표에서 살펴 우리가 등록 위에 그것이이다 수퍼 유저, 그것은 장고의 모든 권리)가

세, 인증은 사용자 정의 로그인 페이지 로그인 수퍼 유저

위의 예 수퍼 유저에 따르면, 우리는 우리가 이전에 만든 슈퍼 사용자 세실리아를 확인하기 위해 사용자의 로그인 페이지를 작성하는 자신을 모듈 인증을 사용할 수있는 정상 로그인의 가능성 여부.

# 首先自定义一条url

# 利用auth模块登录超级用户
url(r'^login/$',views.login),
# views.py视图函数

# 我们既然要在视图函数中用auth模块,就要先导入这个模块
from django.contrib import auth
def login(request):
    if request.method == 'POST':
        # 获取登录页面的post请求的用户名和用户密码
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 按道理来说,我们是不是应该通过表名去数据库表中查找有没有这个用户名和密码的数据
        # 但是现在这个auth_user表不是我们自己创建的模型表,所以我们没法用表名去表里查有没有这个用户数据
        # 这里就算是给了我们表名,我们就一定能够去这个表里查?
                # 不可以,
                # 应为auth模块在创建超级用户的时候,还记得存到表中的密码是密文的吧
                # 但是你通过表名,去查数据,查出来的是明文的,所以是不可以的
        
        # 所以我们要用auth模块去查询当前登录的用户,
        user_obj = auth.authenticate(username=username,password=password)
        # user_obj :当auth.authenicate帮我们校验数据的时候
        # 校验成功时,他是直接返回我们登录的用户名,但是是一个对象
        # 校验不成功,它就返回None
        print(user_obj)
        print(user_obj.username) # 可通过对象点的方法去值
        print(user_obj.password)
        if user_obj: # 判断是否有这个对象
            # 如果有值,则通过auth.login(request,name=user_obj),自动操作session
            auth.login(request,user_obj) # 这里是记录用户浏览器的状态
        else:
            return redirect('/login')   
            
    return render(request,'login.html')
// login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %} //这里当我们不注释中间件csrf的时候,post提交数据的时候,一定要加这句话
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>
    <p><input type="submit"></p>
</form>
</body>
</html>

이제 우리는 자신의 로그인 페이지를 작성하여 온, 정식 인증 테스트 모듈은 어떻게 상황을 체크 할 로그인 :

  1. 첫째, 서버를 재부팅 브라우저에서 127.0.0.1:8001/login 입력, 우리의 수퍼 유저 전에 로그인 페이지, 등록 로그인 명령을 입력

  1. 우리는 어떤 결과를 얻을 수, 프린트 서버 인증 모듈을 통해 얻을 수있는 반환 값을 살펴
user_obj = auth.authenticate(username=username,password=password)
        # user_obj :当auth.authenicate帮我们校验数据的时候
        # 校验成功时,他是直接返回我们登录的用户名,但是是一个对象
        # 校验不成功,它就返回None
        print(user_obj)
        print(user_obj.username)  # 可通过对象点的方法去值
        print(user_obj.password)

  1. 입력 127.0.0.1:8001/login에 계속 접속, 로그인 페이지를 입력 F12 열린 개발자 도구는 인증 모듈이 자동으로 세션 설정 기본 세션이 표를 참조 django_session라는 이름의 서버에 이동 저장 할 우리를 도와 볼 수 세션의 서비스 결국 더 절약 가치가 없다
auth.login(request,user_obj)

넷, 인증 모듈에있어서 공통된

슈퍼 사용자를 만드는 방법 4.1

수퍼 유저는 장고 관리자 배경 관리에 로그인하는 데 사용됩니다

# 其实如何去创建超级用户,在上面已经有了
1. 打开tools manage.py Task终端窗口
    createsuperuser
2. 根据提示,去输入用户名,密码就好了(附图)    

일반 로그인 페이지를 사용하는 방법 4.2은 사용자가 존재하거나하지 않는 것이 확인

인증 모듈 기능은 우리가 세션 쿠키를 통해 갈 필요가 없다는 것입니다 및 사용자의 브라우저의 로그인 상태를 기록

당신이 성공적으로 로그온 할 수 있는지 지금은 내가 좋은 슈퍼 사용자가 만든 위의 예를 취할 것입니다, 정상적인 로그인 페이지를 작성, 내가 로그인 확인을 참조하십시오

# 首先默认我们已经写好了一个登录页面,现在去输入用户的用户名和密码:(默认是正确的)
# 然后利用auth模块帮我们校验这个超级用户存不存在

# 这就是在校验我输入的密码,和超级用户的密码是否匹配
user_obj = auth.authenticate(username=username,password=password)

참고 : 존재의 USER_OBJ 객체에 돌아 왔을 때 사용자 이름 이름은 다음을 수행 할 수 없습니다되어 확인에 실패, user_obj == 없음

user_obj.usernmae
user_obj.password
·····

4.3 인증 사용자의 로그인 상태를 저장

우리는 우리 자신의 방식으로 세션 쿠키를 통해 사용자를 저장하기 위해 자신의 쓰기 인증 모듈을 학습하기 전에 서버에 기록

이제 인증 모듈은 전체 세트, 그의 기록의 일부가 아닌, 정식 일부의 사용에 관한 인증 모듈을 사용하는 단어로, 그래서 우리가이 일을하는 데 도움

auth.login(request,user_obj)
# 在用户登录成功以后,执行这一句操作,我们会发现,在浏览器和服务端,都出现当前浏览器的session

가장 중요한 것은 :만큼 우리와 요청을 얻을 수있는 장소로 한, 위의 문장을 실행 한 후, 우리는 통해 사용할 수 있습니다 request.user 현재 로그온 대상 사용자에 도착

4.4 인증의 的의 request.user

request.user
# 当用户登录的情况下,返回的结果是用户对象
# 当用户没有登录的情况下,返回的一个AnonymoUser---匿名用户

# 但是当我们如果需要对当前用户有没有登录,进行一些逻辑处理的时候,很明显,当用户没有登录的情况下,我们通过request.user不好进行判断呀

request.user.is_authenticated() 
# 如果用户登录:返回True
# 用户没有登录:返回False

4.5 구성 로컬 / 글로벌 구성 장식

로그인, 우리의 페이지를 방문 돌아 가면 내가 만약 여러 개의보기, 나는 로그인 페이지로 다시 로그온하지 않는, 모든보기 기능은 사용자가 로그인하지 않은 내용을 확인하려면

그래서, 지금하지가 아, 여기, 장식가 우리 자신을 작성 생각할 장식을하지 않아도, 그리고 인증의 단계를 다음과

from django.contrib.auth.decorators import login_required
# 局部配置,就是只对当前被装饰的有效
# 用我们以前用过的装饰器的方法,来装饰需要被装饰的视图函数
@login_requirde ## 仅仅这样是不行的,如过直接这样的话,我们用的就是auth默认的装饰器了


# 所以必须要这样写
@login_required(login_url = '/login') # 配置成我们自己的url路径
# 全局配置:在settings中配置,因为如果我们有一百个视图函数都需要用到装饰器的时候,          用局部配置的,也会出现代码的冗余现象,因为我们毕竟要写100行

# 在settings中配置如下代码
LOGIN_URL = '/login/'

# 然后我们的装饰器就可以这样写
@login_required

4.6 데코레이터가 사용자 암호 변경 사항을 구현하여

나는 현재 사용자의 암호를 수정하고 암호를 변경하려면, 나는 그것이 사용자 로그인의 경우에 할 수있는 암호를 변경해야 정상적인 상황이 아니다

우리는 좋은 슈퍼 테스트하려면 위의 등록 된 사용자를 계속

# views.py


# 用户登录功能
def login(request):
    next_page = request.GET.get('next')
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = auth.authenticate(username=username,password=password)
        if user_obj:
            auth.login(request, user_obj)
            if next_page:
                return redirect(next_page)
            else:
                return redirect('/login')
        return HttpResponse('用户名密码错误!')
    return render(request,'login.html')


# 修改密码
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')
def set_pwd(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        old_pwd  =request.POST.get('old_pwd')
        new_pwd  =request.POST.get('new_pwd')
        
        # 拿到用户输入的旧密码后,通过auth模块,
        # check_password()方法,检验这个用户的密码和它输入的旧密码一致不一致
        is_right = request.user.check_password(old_pwd)
        if is_right:# 如果一致
            # 通过request.user拿到当前登录的用户对象
            # 通过set_password()方法将原密码改为用户设置的新密码
            request.user.set_password(new_pwd)

            # 写完上面的那一步还没有完,必须要写下面这句,保存到数据表中
            request.user.save()
            return redirect('/login')
    return render(request,'set_pwd.html')


# 首页
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')
def home(request):
    return HttpResponse('我是首页')

새로운 사용자를 등록하는 방법 4.7 인증

from django.contrib.auth.models import User

User.objects.create_user(username=username,password=password)  # 创建普通用户
# 此处如果直接使用crete的话,会将密码存成明文的,下次就登录不上了
       User.objects.create_superuser(username=username,password=password,email='[email protected]') # 创建超级用户  邮箱字段必须填写

다섯째, 확장 필드 AUTH_USER 테이블

두 가지 방법으로 AUTH_USER 테이블 필드 확장 :

첫 번째 (권장하지 않음) : 생성 한 테이블 관계를 사용하여 필드를 확장

(상속에 의해) 제 : 상속을 통해 원래 AUTH_USER 클래스

주로 두 번째 방법에 대해 여기

思想:
 1. 首先我们在应用的模型层中导入
     from django.contrib.auth.models import AbstractUser
        
 2. 自己定义一个类继承(AbstractUser)
    注意:你继承了AbstractUser之后 你自定义的表中 字段不能跟原有的字段冲突
    
 3.一定要在settings配置文件中指定
    AUTH_USER_MODEL = 'app01.Userinfo'
    # 固定语法: AUTH_USER_MODEL = '应用名.表名'    

참고 : 우리가 auth_user와 테이블의 새 필드를 확장 할 필요가있을 때, 그들은 확인해야합니다, 어떤 마이그레이션 기록을 가질 수 없습니다 현재 응용 프로그램은 한 이동 기록이있는 한, 당신은 테이블이 마이그레이션 한 AUTH_USER 의미 테이블 모델은 인스턴스화되고

추천

출처www.cnblogs.com/xichenHome/p/11774372.html