Де авторизація вписується в шарувату архітектуру?


24

Як правило, я розміщую рішення про авторизацію в контролерах на стороні сервера. Останнім часом вони були RESTful кінцевими точками, але, я думаю, те саме стосується архітектур типу MVC. Заради аргументів припустимо, що це авторизація на основі ролей. Захищений метод буде анотовано або робити перевірки та повертати 403s, якщо це необхідно.

Тепер, зважаючи на те, що авторизація насправді є бізнес-правилом - наприклад, "лише адміністратори можуть перелічити X", я думаю, що їх слід відсунути на шар. Коли контролер просить бізнес-рівень провести операцію, сервіс або бізнес-рівень повідомляє контролер, що він не має права.

Це розумний підхід? Чи є недоліки в цьому?

Мені не подобається мати AuthorisationService, який по суті містить купу статичних процедурних правил, закодованих для цього, але, можливо, має сенс зберігати всю логіку доступу в одному місці. Це наскрізна проблема, яку слід тримати окремо?

Тож я запитую, чи хтось це зробив і як вони це досягли чистим способом, чи є якісь хороші ресурси, які я міг би прочитати. Я використовую Java fwiw, але це мовне агностичне питання.

Я перевірив відповідні питання тут, і вони дуже тонкі на місцях і відповіді. Наприклад: Валідація та авторизація в моделях доменів та перенесення їх через службовий рівень MVC

Я читаю весняні документи з безпеки, які висловлюють хороші аргументи за те, що вона є суперечливою проблемою, але я переживаю, що це лише "весняний шлях", і я хотів би розширити перспективи. Він також прив'язує вашу програму до конкретних рамок.


1
Статус 403 неправильний для проблем із авторизацією. Використовуйте 401.
gnasher729

@ gnasher729 Я думаю, що це назад. Аутентифікації 401 кошти не змогли або не передбачені, 403 означає , що ви не маєте права доступу: stackoverflow.com/questions/3297048 / ...
JimmyJames

@ JimmyJames, є ще одна школа думок, що вам слід просто використовувати лише одну з них для всіх помилок аутентифікації та авторизації, оскільки це не дозволяє автоматизованим інструментам легко зрозуміти бізнес-логіку. Тут є деяка свобода.
Берін Лорич

1
@BerinLoritsch Вибачте, ви хочете сказати, що ідея полягає у ускладненні розуміння, чи це проблема з автентифікацією чи авторизацією? RFC здається досить зрозумілим, але заявляється, що ви можете використовувати 404 замість 403, якщо ви не хочете виставляти занадто багато інформації. Чи є посилання, яке ви можете надати для аргументу щодо використання 401 замість 403?
JimmyJames

@JimmyJames, так. Цей мислительний процес походить від фахівців із безпеки, а не від розробників. І я також бачив вашу рекомендацію 404 повністю приховати інформацію, щоб приховати, що ресурс навіть існує.
Берін Лорич

Відповіді:


9

Його найкраща практика розкривати лише варіанти, на які користувач має право.

Це змушує авторизацію бути наскрізною проблемою. "Перегляд" повинен знати, що користувачеві дозволено робити, перш ніж він зможе створити параметри та меню для відображення.

Задній кінець не повинен довіряти передньому, щоб приймати рішення щодо безпеки, тому він повинен перевірити авторизацію.

Можливо, існують бізнес-правила, які впливають на авторизацію залежно від даних, наприклад, "Тільки користувачі із залишком понад 5000 доларів можуть звернутись до переказу іноземної валюти" або "Тільки користувач, розташований у головному офісі, може переглядати ці акаунти". Отже, необхідна певна логіка авторизації в межах бізнес-логіки.

Існують також Технічні дозволи, які слід врахувати - кому дозволено переглядати журнали, хто може створювати резервну копію / відновлювати базу даних тощо.

Отже, зрештою, кожен компонент у вашій країні може мати певні вимоги щодо безпеки та / або авторизації, на практиці майже неможливо перетворити це на окремий "рівень авторизації".


7

Я думаю, що це абсолютно розумний підхід до ввімкнення авторизації у вашому рівні обслуговування. Вам потрібно захистити свою службу від здійснення несанкціонованих дій (особливо модифікацій даних). Ваш сервісний рівень може міститись в одній бібліотеці та використовуватися різними шарами презентації (у вас можуть бути різні UI-додатки, які використовують один і той же рівень Сервісу). І ви не можете розраховувати на те, що конкретні шари презентації виконують необхідну перевірку. Це особливо важливо, якщо згодом ви вирішите перенести рівень обслуговування в окремий процес (наприклад, дотримуючись підходу SOA).

Тепер про те, як цього досягти "чистим способом". Мені не подобається ідея засмічення бізнес-логіки за допомогою перевірок авторизації, тому якась конкретна реалізація підходу, орієнтованого на аспект-програмування, може допомогти: це може бути декорування сервісних методів спеціальними атрибутами або використання динамічних проксі-серверів з перехопленнями.

І що важливо, мені потрібно визнати, що в дуже простих проектах, можливо, ви могли б жити без відокремлених перевірок, просто щоб спростити своє життя. Але важливо не пропустити момент, коли «простий проект» став перетворюватися на «складний проект».


7

Мені подобається натискати перевірки авторизації настільки низько, наскільки вони можуть йти! (Але не далі!)

Ви все ще можете писати автоматизовані тести авторизації проти шарів "вище" цього. І деякі правила можуть бути застосовні або матимуть сенс лише у більш високих рівнях, як ваш сервісний рівень (CanView / CanSerialize?). Але, як правило, я вважаю, що найбезпечнішою стратегією авторизації є також "DRY-est" стратегія: Тримайте авторизацію якомога менше, в самому "загальному" або "спільному" коді, наскільки це можливо (без надто ускладнення правил аутентифікації).

Подумайте про альтернативу. Якщо ваші правила авторизації перевіряються та застосовуються лише на рівні сервісу, а ваші бідні об’єкти домену згинаються до волі примхливих сервісних об’єктів, вам часто потрібно буде застосовувати кожне окреме правило не один раз, у кількох об'єктах та кількох місця в кожному об'єкті і в більш складному коді.

Крім того, коли ваша аналітична команда наймає консалтингову фірму для написання звітних служб за допомогою об’єктів вашого домену, вам не хочеться довіряти цим розробникам! (Або як Ви будуєте додаткові послуги або дзвінки через одні і ті ж об'єкти. Будь Ви не хочете , щоб зламати велику книгу бізнесу - правила і розуму.) Надій для забезпечення дотримання цих правил належним чином знову ; ви хочете, щоб ваш домен вже їх знав і застосовував.


@Shoe Якщо я розумію ваше занепокоєння - це такий собі сенс. Якщо лише "адміністратор" має, згідно з правилами бізнесу, дозвіл на створення Widget, те саме правило діє скрізь. (Тож не ризикуйте, щоб хтось ігнорував це!) Якщо правило не застосовується скрізь, це насправді не правило Widgetsі єдине Widgets . . Натисніть на правила, наскільки вони можуть дійти (окремі правила); але, не наскільки "правила" можуть піти ... Я відчуваю, що я не викладаю відмінності добре. Але, там, мабуть, є різниця.
svidgen

На мій досвід, правила авторизації часто є частиною правил бізнесу. Таким чином, "наскільки це може йти вниз", це часто мій доменний шар. Але я підозрюю, що там, де ваші правила "повинні" потрапити, - це лише наслідок вашого домену, характеру правил і того, як бізнес про них говорить.
svidgen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.