Django : Как мы можем настроить декоратор login_required?
Я хочу переписать декоратор входа в Django для проверки аутентификации Azure AD. Для аутентификации я использовал учебник (https://docs.microsoft.com/en-us/graph/tutorials/python). Я не знаю, как работать с группами и разрешениями, поскольку я использую эту аутентификацию, поэтому я беру имя пользователя, фамилию в качестве пароля, чтобы создать пользователя в модели User django.
Для этого я модифицирую функцию обратного вызова из учебника :
def callback(request):
# Make the token request
result = get_token_from_code(request)
#Get the user's profile
user = get_user(result['access_token'])
# Store user
store_user(request, user)
# Get user info
# user attribute like displayName,surname,mail etc. are defined by the
# institute incase you are using single-tenant. You can get these
# attribute by exploring Microsoft graph-explorer.
username = user['displayName']
password = user['surname']
email = user['mail']
try:
# if use already exist
user = User.objects.get(username=username)
except User.DoesNotExist:
# if user does not exist then create a new user
user = User.objects.create_user(username,email,password)
user.save()
user = authenticate(username=username,password=password)
if user is not None:
login(request,user)
messages.success(request,"Success: You were successfully logged in.")
return redirect('home')
return redirect('home')
Если я хочу проверить, аутентифицирован ли пользователь в Azure AD, я должен сделать что-то вроде этого :
if request.session.get('user').get('is_authenticated') :
Но я не знаю, как совместить с аутентификацией django, чтобы проверить и то и другое. Кто-нибудь может мне помочь
Спасибо
Самым простым способом будет использование декоратора user_passes_test для создания собственной функции и применение ее в качестве декоратора к вашим представлениям как указано в документации
from django.contrib.auth.decorators import user_passes_test
def check_azure(user):
# so something here to check the azure login which should result in True/False
return #theResult of your check
@user_passes_test(check_azure)
def my_view(request):
...
Вот мое решение :
from django.shortcuts import redirect
def authenticated_user(view_func) :
def wrapper_func(request, *args, **kwargs):
if request.user.is_authenticated and request.session.get('user').get('is_authenticated') :
return view_func(request, *args, **kwargs)
else :
return redirect('login')
return wrapper_func