Сделать аутентификацию и вход в систему для нескольких таблиц, кроме таблицы auth User в django?
Я создал модель hostTable в приложении hostlogin и хочу использовать эту таблицу для входа в систему, для этого я создал пользовательскую функцию authenticate, потому что стандартная authenticate() работала только для таблицы пользователей auth. Также функция login() не прикрепляет текущую сессию к пользователям из hostTable. Хотя это работает нормально, если я устанавливаю AUTH_USER_MODEL ='hostlogin.HostTable'
, но тогда страница администратора не работает, и это не является приемлемым решением, потому что hostTable я буду использовать для входа преподавателей (127.0.0.1:8081/tlogin/) и studentlogin таблица я буду использовать для входа студентов (127. 0.0.1:8081/slogin/), то как я буду использовать две разные таблицы для разных login() и authenticate(), ни для одного из этих двух пользователей я не хочу предоставлять доступ администратора (127.0.0.1:8081/admin/), поэтому я не использую таблицу auth user.
models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import AbstractUser,AbstractBaseUser,PermissionsMixin
from django.contrib.auth.hashers import make_password, check_password
class HostTable(AbstractBaseUser):
pid=models.AutoField(primary_key=True,auto_created=True)
username=models.CharField(max_length=50,unique=True)
password=models.CharField(max_length=128)
#...someotherfields...
createdtime =models.DateTimeField(default=timezone.now)
last_login=models.DateTimeField(default=timezone.now)
is_authenticated=models.BooleanField(default=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS=['hostname','ownername','password']
def save(self, *args, **kwargs):
self.password = make_password(self.password)
super(HostTable, self).save(*args, **kwargs)
def __str__(self):
return self.hostname
view.py
def hostlogin(request):
if request.method == 'POST':
form = UserLoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
print('view',username,password)
user = hostTableAuth.authenticate(request,username,password)
print('view',user)
if user is not None:
login(request,user)
messages.success(request, f' welcome {username} !!')
# print(request.META['REMOTE_USER'])
print('r',request.user)
print('r',request.user.is_authenticated)
print('s',request.session)
request.session['username']=username
return redirect('home')
else:
messages.info(request, f'account done not exit plz sign in')
form = UserLoginForm()
return render(request, 'hostlogin/login.html', {'form':form, 'title':'log in'})
customeAuth.py
from django.contrib.auth.backends import BaseBackend,ModelBackend
from django.contrib.auth.hashers import check_password
from .models import HostTable
class hostTableAuth(ModelBackend):
def authenticate(self, request,username, password):
user=HostTable.objects.filter(username=username).first()
print('user',username,password,user.password)
if user is not None:
login_valid = user.username == username
pwd_valid = check_password(password, user.password)
print(login_valid,pwd_valid)
if login_valid and pwd_valid:
try:
user = HostTable.objects.get(username=username)
except HostTable.DoesNotExist:
# Create a new user. There's no need to set a password
# because only the password from settings.py is checked.
user = HostTable(username=username)
user.is_staff = True
user.is_superuser = True
user.save()
print('auth1',user)
return user
else:
print('auth2',user)
return None
def get_user(self, user_id):
try:
return HostTable.objects.get(pk=user_id)
except HostTable.DoesNotExist:
return None
Ваши модели похожи на :
forms.py :
from .models import User
class RegisterUser(forms.ModelForm):
class Meta:
model = User
fields = ['phone', 'email', 'username', 'password', 'first_name', 'last_name']
labels = {
'password': 'Password',
}
widgets = {
'email': forms.EmailInput(attrs={'class':'form-control my-5', 'placeholder':'example1234@gmail.com'}),
'phone': forms.NumberInput(attrs={'class':'form-control my-5', 'placeholder':'09123456789'}),
'username': forms.TextInput(attrs={'class':'form-control my-5', 'placeholder':'Username'}),
'password': forms.PasswordInput(attrs={'class':'form-control my-5', 'placeholder':'••••••••••••'}),
'first_name': forms.TextInput(attrs={'class':'form-control my-5', 'placeholder':'Ali'}),
'last_name': forms.TextInput(attrs={'class':'form-control my-5', 'placeholder':'alizadeh'}),
'role': forms.ChoiceWidget(attrs={'class':'form-control my-5'}),
}
views.py :
def loginUser(request):
if request.user.is_authenticated:
messages.warning(request, 'شما نمیتوانید به این صفحه مراجعه کنید')
return redirect('HOME')
elif request.method == 'POST':
phone = request.POST.get('phone')
password = request.POST.get('password')
user = auth.authenticate(request, phone=phone, password=password)
if user is not None:
auth.login(request, user)
messages.success(request, 'خوش آمدید')
return redirect('PROFILE')
else:
messages.error(request, 'مشخصات وارد شده اشتباه می باشد، دوباره تلاش کنید')
return render(request, 'user/login.html')
return render(request, "user/login.html")
def registerUser(request):
if request.user.is_authenticated:
messages.warning(request, 'شما نمیتوانید به این صفحه مراجعه کنید')
return redirect('HOME')
elif request.method == 'POST':
form = RegisterUser(request.POST)
if form.is_valid():
email = form.cleaned_data['email']
phone = form.cleaned_data['phone']
username = form.cleaned_data['username']
password = form.cleaned_data['password']
first_name = form.cleaned_data['first_name']
last_name = form.cleaned_data['last_name']
role = forms.cleaned_data['role']
user = User.objects.create_user(email=email, username=username, password=password,first_name=first_name,role=role,
last_name=last_name, phone=phone)
user.set_password(password)
user.is_active = True
user.save()
messages.success(request, 'اطلاعات شما با موفقیت ثبت گردید')
return redirect('HOME')
else:
messages.error(request, f'{form.errors}')
return redirect('REGISTER')
else:
form = RegisterUser()
return render(request, "user/signup.html", {'form': form})
извините, из-за того, что я перс (иранец)... вы видите, что сообщения набраны персидскими словами :). Вы можете изменить их по своему усмотрению