Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Login as user pre admina #354

Closed
martinmacko47 opened this issue Feb 15, 2021 · 4 comments
Closed

Login as user pre admina #354

martinmacko47 opened this issue Feb 15, 2021 · 4 comments

Comments

@martinmacko47
Copy link
Owner

martinmacko47 commented Feb 15, 2021

Treba nam tool pre admina, aby sa mohol prihlasit ako lubovolny user a vykonat v jeho mene lubovolnu akciu. Bez toho, aby admin poznal userovo heslo.

Idea je, ze v admin detaile usera bude button "Login as user", na ktory ked admin klikne, tak mu to v novom tabe otvori web s prihlasenym userom. Pricom admin bude prihlaseny nadalej, aby stale mohol vykonavat akcie v admin rozhrani. Ale v tom novom tabe mohol vykonavat aj akcie ak user.

Tipujem, ze bude na to nejaka existujuca kniznica. Skus pogooglit, ci nieco nenajdes. Ak nic nenajdeme, tak skus nieco vymysliet. Zrejme by sa to implementovalo nejakou magiou so sessions. Ze v ramci admin session by sme si pamatali, ze admin je prihlaseny ako user X. A potom pri otvoreni non-admin obrazovky by sme usera identifikovali okrem standardnej user session aj cez admin session, ako je prihlaseny ako user X. Ak sa Ti nepodari nic vymysliet, zavolajme si k tomu a vymyslime to spolu.

Pre jednoduchost, mozeme tool obmedzit, ze admin moze byt naraz prihlaseny iba ako jeden user. Teda ak je admin prihlaseny ako user X a klikne na prihlasit ako dalsi user Y, tak ho od z usera X odhlasi.

@martinmacko47
Copy link
Owner Author

martinmacko47 commented Mar 22, 2021

Vyzera, ze to pojde takto:

V ProfileAdmin sprav admin view login_as, zaves ho na admin URL ^(.+)/login-as/$, kde (.+) bude parameter s ID usera, ktoreho prihlasujeme. A pridaj nan linku ako posledny stlpec v ProfileAdmin. Ako sa robia admin view s admin URL pozri napriklad ako mame spraveny admin view download v DownloadAdminMixin.

Tento view nastavi request.session[u'admin_login_as'] na ID usera z parametra a redirectne na reverse(u'inforequests:mine')

Potom v AUTHENTICATION_BACKENDS settingoch nahrad django.contrib.auth.backends.ModelBackend upravenym auth backendom. Tento upraveny auth backend podedi ModelBackend a upravi get_user(self, user_id) metodu takto:

  1. pomocou get_request() z poleno.utils.http ziska aktualny request
  2. pomocou povodneho get_user(user_id) ziska usera, ktory je prihlaseny
  3. ak prihlaseny user nie je admin, tak metoda vrati toho prihlaseneho usera
  4. inac, ak request.path je admin path, tak metoda vrati toho prihlaseneho admina
  5. inac, ak nie je nastavene request.session[u'admin_login_as'], tak metoda tiez vrati toho prihlaseneho admina
  6. inac, tj. ak je prihlaseny admin, nejde o admin URL a je nastavene request.session[u'admin_login_as'], tak metoda vrati usera s ID request.session[u'admin_login_as']. Toho ziska zavolanim povodneho get_user() s request.session[u'admin_login_as'] namiesto user_id

Test, ci ide o admin URL alebo by som nerobil regexpom ako si pisal, ale skusil by som najst view pre danu URL a nejak zistit, ci to je admin view, alebo nie.

V okrajovych pripadoch, napriklad ak request nie je k dispozicii, alebo URL sa nepodari reverznut, vratil by som to, co by vratil povodny ModelBackend. Teda povodne prihlaseneho usera.

Tento upraveny auth backend by sa zislo definovat niekde v poleno adresari, kedze je to vseobecna reusable vec. Rovnako admin login as view by sa zislo spravit ako admin mixin. Analogicky ako mame DownloadAdminMixin.

@martinmacko47
Copy link
Owner Author

martinmacko47 commented Oct 25, 2021

V separatnom PR treba doplnit admin_obj_format, aby umoznoval otvarenie linky v novom tabe. Vid: #418 (comment)

Edit: Vydelene do separatnej issue: #424

viliambalaz added a commit that referenced this issue Nov 5, 2021
viliambalaz added a commit that referenced this issue Nov 19, 2021
viliambalaz added a commit that referenced this issue Nov 25, 2021
viliambalaz added a commit that referenced this issue Nov 25, 2021
viliambalaz added a commit that referenced this issue Nov 25, 2021
viliambalaz added a commit that referenced this issue Nov 25, 2021
viliambalaz added a commit that referenced this issue Nov 28, 2021
viliambalaz added a commit that referenced this issue Nov 28, 2021
viliambalaz added a commit that referenced this issue Nov 28, 2021
viliambalaz added a commit that referenced this issue Nov 28, 2021
viliambalaz added a commit that referenced this issue Nov 28, 2021
viliambalaz added a commit that referenced this issue Dec 7, 2021
viliambalaz added a commit that referenced this issue Dec 23, 2021
viliambalaz added a commit that referenced this issue Jan 4, 2022
* #354 Login user from admin

* #354 Remodel AdminLoginAsBackend

* #354 Add review suggestions

* #354 Create AdminLoginAsMixin

* #354 Move AdminLoginAsMixin to poleno library

* #354 Move AdminLoginAsAdminMixin to poleno directory

* #354 Allow admin_login_as from UserAdmin and fix wrong pk in ProfileAdmin

* #354 Create AccountAdapter

* #354 Rename login_as_redirect_viewname attribute to lowercase

* #354 Set authentication_backend path

* #354 Remove unused import
@martinmacko47 martinmacko47 assigned mmmaly and unassigned viliambalaz Jan 8, 2022
@martinmacko47
Copy link
Owner Author

@mmmaly Tool pre admina na login as user je hotovy. Pls pretestuj.

@martinmacko47
Copy link
Owner Author

Otestovane.

viliambalaz added a commit that referenced this issue Apr 12, 2022
* #354 Login user from admin

* #354 Remodel AdminLoginAsBackend

* #354 Add review suggestions

* #354 Create AdminLoginAsMixin

* #354 Move AdminLoginAsMixin to poleno library

* #354 Move AdminLoginAsAdminMixin to poleno directory

* #354 Allow admin_login_as from UserAdmin and fix wrong pk in ProfileAdmin

* #354 Create AccountAdapter

* #354 Rename login_as_redirect_viewname attribute to lowercase

* #354 Set authentication_backend path

* #354 Remove unused import
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants