Django 사용자 정의 로그인

8074 단어
최근에django를 사용하여 계정 시스템과 관련된 서비스를 개발한 다음에django 자체가 계정 모듈을 가지고 있지만 가끔은 이django가 자체로 가지고 있는 계정을 확장해야 한다.
로그인 검증 프로세스 사용자 정의
django는 authentication backends에 사용자 정의 로그인 인증을 제공합니다. 우리는django 자체의 로그인 인증을 건너뛰고 인증을 다시 쓰는 방법을 사용할 수 있습니다.또한django 자체의 검증이 통과되지 않은 후에 우리가 쓴 사용자 정의 검증 방법을 호출할 수 있습니다.
어떻게 사용합니까?
우선 대응하는 app 디렉터리에 파일을 만듭니다. 예를 들어 accounts라는 앱이 있는데,backends를 만듭니다.py 파일, 클래스를 만들고 Object를 계승하면 됩니다. 그리고 클래스에 authenticate 방법과 get 를 작성합니다.사용자 메서드(예:
from django.contrib.auth.models import User


class MyBackend(object):

    def authenticate(self, username=None, password=None):
        #        ,  None   
        print "username: {username} 
password: {password}".format(username=username, password=password) if username is not None and password is not None: try: user = User.objects.get(username=username) valid_user = user.check_password(password) if valid_user is None: return None except User.DoesNotExist: user = User(username=username, password=password) user.is_staff = True user.save() return user return None def get_user(self, user_id): # The get_user method takes a user_id – which could be a username, database ID or whatever, but has to be the primary key of your User object – and returns a User object. try: return User.objects.get(pk=user_id) except User.DoesNotExist: return None

그리고 settings에서.py 파일 추가 변수 AUTHENTICATIONBACKENDS
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend', #         ,          ,   
    'ff.accounts.backends.MyBackend', #         backends
]

사용자 지정 권한
해당 모델에 메타에 대한 사용 권한 내용을 추가합니다. 예를 들어,
class Article(models.Model):
    class Meta:
        permissions = (
            ('can_change_article', 'Can change articles'),
            ('can_view_article', 'Can view articles'),
        )

UserModel 확장
UserModel을 확장하면 기존의 User에 필드를 추가할 수 있습니다. 두 가지 방법이 있습니다. 하나는 OneToOneField와proxy입니다. 여기는 OneToOneField를 사용했습니다.
# models.py
from django.db import models
from django.contrib.auth.models import User

class GameInfo(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    money = models.IntegerField(default=0)
# admin.py
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin

from ff.accounts.models import GameInfo


class GameInfoInline(admin.StackedInline):
    model = GameInfo
    can_delete = False
    verbose_name_plural = 'gameinfo'


class UserAdmin(BaseUserAdmin):
    inlines = (MyUserInline, )

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

이렇게 하면 admin 백그라운드에서 대응하는 필드를 볼 수 있고 코드에 접근하려면 GameInfo표에 접근해야 한다. 예를 들어 다음과 같다.
u = User.objects.get(username='test')
#     test money
game_user_money = u.gameinfo.money

UserModel로 모델 사용자 정의
1. 사용자 모델 정의, AbstractBaseUser 계승
2, 정의 UserManager, 계승 BaseUserManager
3. 관련 Form을 정의한다. 예를 들어CreateForm, ChangeForm은 admin을 정의한다.
4、settings를 수정합니다.py, 변수 추가 AUTHUSER_MODEL
직접적으로 예를 들면, 공식 문서도 예가 있다.
# models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager


class GameUserManager(BaseUserManager):
    def create_user(self, gameusername, password=None):
        if not gameusername:
            raise ValueError('Users must have an gameusername')
        user = self.model(
            gameusername=gameusername
        )
        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_superuser(self, gameusername, password):
        user = self.create_user(gameusername=gameusername,
                                password=password)
        user.is_superuser = True
        user.save(using=self._db)

        return user


class GameUser(AbstractBaseUser):
    gameusername = models.CharField(max_length=40, unique=True)
    name = models.CharField(max_length=100)
    level = models.IntegerField(default=0)
    money = models.IntegerField(default=0)
    food = models.IntegerField(default=0)

    is_active = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)

    objects = GameUserManager()

    USERNAME_FIELD = 'gameusername'

    def get_full_name(self):
        return self.name

    def get_short_name(self):
        return self.name
# forms.py
from django import forms
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from custom_auth.accounts.models import GameUser


class GameUserCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = GameUser
        fields = ('gameusername', 'level', )

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        user = super(GameUserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user


class GameUserChangeForm(forms.ModelForm):
    password = ReadOnlyPasswordHashField()

    class Meta:
        model = GameUser
        fields = ('gameusername', 'password', 'level', )

    def clean_password(self):
        return self.initial['password']
# admin.py
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin

from custom_auth.accounts.forms import (
    GameUserCreationForm,
    GameUserChangeForm,
)
from custom_auth.accounts.models import GameUser


class GameUserAdmin(UserAdmin):
    form = GameUserChangeForm
    add_form = GameUserCreationForm

    list_display = ('gameusername', 'level', 'money', )
    list_filter = ('is_superuser',)
    fieldsets = (
        (None, {'fields': ('gameusername', 'password')}),
        ('Personal info', {'fields': ('level',)}),
        ('Permissions', {'fields': ('is_superuser',)}),
    )
    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
    # overrides get_fieldsets to use this attribute when creating a user.
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('gameusername', 'level', 'password1', 'password2')}
        ),
    )
    search_fields = ('gameusername',)
    ordering = ('gameusername',)
    filter_horizontal = ()


admin.site.register(GameUser, GameUserAdmin)
admin.site.unregister(Group)
# settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'custom_auth.accounts', #    app
]

AUTH_USER_MODEL = 'accounts.GameUser'

참고, 변수 AUTHUSER_MODEL 이건 그냥 appname.UserModelName 이 형식입니다. 그렇지 않으면 오류 메시지가 표시됩니다. ValueError: too many values to unpack

좋은 웹페이지 즐겨찾기