برای اینکه ببینیم توی یه پروژه کاربرها با دسترسی های مختلف چطور سایتمون رو میبینن میخایم یه قابلیت به سایت اضافه کنیم که کاربر ادمین بتونه بجای هر کاربری لاگین کنه. login as
برای این کار route های زیر رو اضافه میکنیم:
1 2 3 |
path('impersonation_list/', views.impersonation_list, name='impersonation_list'), path('impersonate_user/<int:user_id>/', views.impersonate_user, name='impersonate_user'), path('stop_impersonation/', views.stop_impersonation, name='stop_impersonation'), |
ویوهای اون
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
@permission_required('user.custom_feature_login_as') def impersonate_user(request, user_id): user_to_impersonate = User.objects.get(pk=user_id) if user_to_impersonate and not user_to_impersonate.is_active: messages.error(request, 'کاربر فعال نیست') return HttpResponseRedirect(reverse('home')) original_user = request.user.id login(request, user_to_impersonate) request.session['original_user'] = original_user request.session['impersonating'] = True return redirect(reverse('home')) def stop_impersonation(request): if 'impersonating' not in request.session: return HttpResponseRedirect(reverse('home')) if 'original_user' in request.session: original_user_id = request.session['original_user'] original_user = User.objects.get(pk=original_user_id) logout(request) login(request, original_user) return redirect(reverse('home')) return HttpResponseForbidden() @permission_required('user.custom_feature_login_as') def impersonation_list(request): users = User.objects.exclude(is_superuser=True).exclude(id=request.user.id) if request.method == 'GET': return render(request, 'user/impersonation_list.html', {'users': users}) |
حالا یه middleware مینویسیم و میزاریم آخر بقیه که توی هر request این رو ست کنه:
1 2 3 4 5 6 7 8 9 10 |
from django.utils.deprecation import MiddlewareMixin class ImpersonateMiddleware(MiddlewareMixin): def process_request(self, request): if request.session.get('impersonating', False): request.impersonating = True else: request.impersonating = False |
حالا از اینا توی تمپلیتها استفاده میکنم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
{% if perms.user.custom_feature_login_as and not request.impersonating %} <a class="dropdown-item d-block" href="/user/impersonation_list/"><i class="fas fa-user-secret font-size-16 align-middle me-1"></i> <span>لاگین به عنوان</span></a> {% endif %} {% if request.impersonating %} <a class="dropdown-item d-block" href="/user/stop_impersonation/"><i class="fas fa-user-slash font-size-16 align-middle me-1"></i> <span>خروج از کاربر</span></a> {% endif %} {% if not request.impersonating %} <a class="dropdown-item d-block" href="/user/password-reset/"><i class="bx bx-key font-size-16 align-middle me-1"></i> <span>تغییر رمز عبور</span></a> <a class="dropdown-item" href="/user/lock"><i class="bx bx-lock-open font-size-16 align-middle me-1"></i> <span>قفل صفحه</span></a> <div class="dropdown-divider"></div> <form method="post" action="/user/logout"> {% csrf_token %} <button type="submit" class="dropdown-item text-danger"> <i class="bx bx-power-off font-size-16 align-middle me-1 text-danger"></i> <span>خروج</span> </button> </form> {% endif %} |