ホームページ  >  記事  >  バックエンド開発  >  Djangoのauthモジュール(ユーザー認証)の詳細説明

Djangoのauthモジュール(ユーザー認証)の詳細説明

不言
不言オリジナル
2018-04-17 10:41:353903ブラウズ

この記事では主にDjangoのauthモジュール(ユーザー認証)の詳細な説明を紹介しますので、参考にしてください。一緒に見てみましょう

auth モジュールは、ログイン認証メソッドをカプセル化したものです。以前は、ユーザーが入力したユーザー名とパスワードを取得した後、ユーザー テーブルにクエリを実行して、そのオブジェクトが存在するかどうかを確認する必要がありました。ユーザー名とパスワードが一致します。

認証モジュールを使用すると、ユーザーのログイン情報がデータベースに存在するかどうかを簡単に確認できます。

さらに、auth は、ユーザーがログインしたかどうかを確認しやすくするためにセッションをカプセル化します

auth のメソッド

auth モジュールメソッドを使用したい場合は、最初に auth モジュールをインポートする必要があります

from django.contrib import auth

django.contrib.auth は多くのメソッドを提供します。ここでは主にそのうちの 4 つを紹介します:

1、authenticate()

はユーザー認証を提供します。つまり、ユーザー名とパスワードが正しいかどうかを検証します。 、通常、ユーザー名とパスワードの 2 つのキーワード パラメーターが必要です

認証情報が有効な場合、User オブジェクトが返されます。 authenticate() は、どの認証バックエンドがユーザーを認証したかを識別するために User オブジェクトに属性を設定します。この情報は後続のログイン プロセスで必要になります。 Authenticate() を使用せずにデータベースから直接取得した User オブジェクトにログインしようとすると、エラーが報告されます。 !

user = authenticate(username='someone',password='somepassword')

2、login(HttpRequest, user)

この関数は、HttpRequest オブジェクトと認証された User オブジェクトを受け入れます

この関数は、Django のセッション フレームワークを使用して、認証されたユーザーをアタッチし、セッション ID とその他の情報をアップロードします。

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.
    ...

3, logout(request) ユーザーをログアウトします

この関数は HttpRequest オブジェクトを受け取り、戻り値はありません。この関数が呼び出されると、現在のリクエストのすべてのセッション情報がクリアされます。ユーザーがログインしていなくても、この機能を使用してもエラーは報告されません。

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

4、ユーザーオブジェクトのis_authenticated()

要件:

1 ユーザーはログイン後に特定のページにのみアクセスできます。

2 ユーザーがログインせずにページにアクセスした場合、ログイン ページに直接ジャンプします

3 ユーザーがリダイレクトされたログイン インターフェイスでログインを完了すると、以前にアクセスしたアドレスに自動的にアクセスします

方法 1:

認証の is_authenticated() メソッドを直接使用して確認します

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

方法 2:

request.user.username に基づいて確認します。空の場合は、ログインしていないことを意味します

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

方法 3:

django がデコレーターを設計しました。この状況の場合:login_requierd( )

from django.contrib.auth.decorators import login_required
   
@login_required
def my_view(request):
 ...

ユーザーがログインしていない場合、Django のデフォルトのログイン URL '/accounts/login/' にジャンプします (この値は LOGIN_URL を通じて設定ファイルで変更できます) 。そして、現在のアクセス URL の絶対パスを渡します (ログインに成功すると、このパスにリダイレクトされます)。

ユーザーオブジェクト

ユーザーオブジェクトの属性: ユーザー名、パスワード (必須) パスワードはハッシュアルゴリズムを使用してデータベースに保存されます

is_staff: ユーザーが Web サイトに対する管理者権限を持っているかどうか

is_active: user is allowed to log in 、``False`` に設定すると、ユーザーを削除せずにユーザーのログインを禁止できます

2.1, is_authenticated()

実際の User オブジェクトの場合、戻り値は常に True です。 ユーザーが認証に合格したかどうかを確認するために使用されます。

認証に合格したことは、ユーザーに権限があることを意味するものではなく、ユーザーがアクティブであるかどうかさえも確認しません。これは、ユーザーが認証に成功したことを意味するだけです。 このメソッドは非常に重要です。バックグラウンドで request.user.is_authenticated() を使用して、ユーザーがログインしているかどうかを確認します。true の場合、request.user.name をフロント デスクに表示できます。 create_user 補助関数を使用してユーザーを作成します:

from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')

2.3 、check_password(passwd)

user = User.objects.get(username=' ')
if user.check_password(passwd):
  ......

パスワードを変更する必要がある場合、最初に元のパスワードを入力する必要があります。指定された文字列がパスワード チェックに合格した場合、True を返します

set_password() を使用してパスワードを変更します

user = User.objects.get(username='')
user.set_password(password='')
user.save 

2.5、簡単な例

登録:

def sign_up(request):
 
  state = None
  if request.method == 'POST':
 
    password = request.POST.get('password', '')
    repeat_password = request.POST.get('repeat_password', '')
    email=request.POST.get('email', '')
    username = request.POST.get('username', '')
    if User.objects.filter(username=username):
        state = 'user_exist'
    else:
        new_user = User.objects.create_user(username=username, password=password,email=email)
        new_user.save()
 
        return redirect('/book/')
  content = {
    'state': state,
    'user': None,
  }
  return render(request, 'sign_up.html', content)  

パスワードの変更:

@login_required
def set_password(request):
  user = request.user
  state = None
  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:
        state = 'empty'
      elif new_password != repeat_password:
        state = 'repeat_error'
      else:
        user.set_password(new_password)
        user.save()
        return redirect("/log_in/")
    else:
      state = 'password_error'
  content = {
    'user': user,
    'state': state,
  }
  return render(request, 'set_password.html', content)

User テーブルを自分で作成する

上記の操作はすべて、django によって自動的に作成される auth_user テーブルに対するものであることに注意してください

。これは django によって自動的に作成されるユーザー テーブルであり、auth モジュールを使用したい場合は、このテーブルを使用 (または継承) する必要があります。

继承表的好处是我们可以增加一些自己需要的字段,并且同时可以使用auth模块提供的接口、方法

下面就讲一下继承auth的方法:

1、导入AbstractUser类,并且写一个自定义的类,继承AbstractUser类,如下:

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
  """
  用户信息
  """
  nid = models.AutoField(primary_key=True)
  telephone = models.CharField(max_length=11, null=True, unique=True)
  ......

需要注意的是,UserInfo表里就不需要有auth_user里重复的字段了,比如说username以及password等,但是还是可以直接使用这些字段的,并且django会自动将password进行加密

2、这样写完之后,还需要在setting.py文件里配置:

AUTH_USER_MODEL = 'blog.UserInfo'

这样,django就知道从blog项目下的models去查找UserInfo这张表了

相关推荐:

Django的cookie使用详解

Django中的Ajax使用方法

以上がDjangoのauthモジュール(ユーザー認証)の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。