Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Aghial
Member

Откуда:
Сообщений: 18
Доброго времени суток!

Есть сущность Право - которое может быть назначено как напрямую пользователю, так и ролям, в составе которых находятся пользователи.

Проект классический spring + spring-security версии 5.1.5
Подключил UserDetailService, хотел использовать аннотацию preauthorize hasauthority - но она проверяет только то, что аутентифицированный пользователь должен входить в заявленную роль, в значении hasauthority

Что использовать, если необходимо проверять доступ к отдельному сервису, как вхождением в роль, так и обладанием определенного права, как в составе отдельной роли, так и напрямую?
25 апр 19, 00:07    [21871032]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Sergunka
Member

Откуда:
Сообщений: 1775
Aghial

Что использовать, если необходимо проверять доступ к отдельному сервису, как вхождением в роль, так и обладанием определенного права, как в составе отдельной роли, так и напрямую?


Oauth 2 протокол вполне с этим справляется через связку client>user>scope
https://oauth.net/2/
25 апр 19, 02:19    [21871072]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
chpasha
Member

Откуда:
Сообщений: 7794
Aghial
аутентифицированный пользователь должен входить в заявленную роль

имхо не входить в заявленную роль, а как раз таки обладать определенным "правом". это важная разница - можно просто грузить и возвращать в UserDetails.getAuthorities() все права которыми он обладает напрямую или через вхождение в группы (роли) скопом. Ну а если нужно давать доступ куда-то по факту вхождения в какую-то группу (а нужно ли если можно определить для группы какое-то особое право?), то можно использовать кастомный код/функции для проверки в PreAuthorize и даже создавать новый аннотации на его основе для переиспользования
25 апр 19, 10:23    [21871280]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38540
Aghial
Есть сущность Право - которое может быть назначено как напрямую пользователю, так и ролям, в составе которых находятся пользователи.

пример приведите.
Большие подозрения, что пишите какой то изврат.
Чем отличается Право назначенное пользователю от роли?
25 апр 19, 10:26    [21871284]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Aghial
Member

Откуда:
Сообщений: 18
Petro123,

Пример:

Пользователь1, Пользователь2
Роль1, Роль2
Пользователь 1 входит в состав Роль1
Право1(доступ к очень важной информации) выдано Роль1 и Пользователь2 (так как этот пользователь очень важный, или существует в единственном экземпляре и не хотелось бы придумывать ему отдельную Роль, и должен иметь доступ только к этому праву)

В итоге нужна аннотация на рест сервис, которая содержит Право1, и доступ к этому сервису должны получить как Пользователь1 (так как у него есть Роль1), так и Пользователь2 (так как он имеет доступ к Праву1)

Технически, это три сущности (Пользователь, Роль, Право)
И две таблицы ПользовательРоль (связь многие ко многим, так как у пользователя может быть несколько ролей, так и роль может принадлежать многим пользователям) и таблица ПравоМаппинг (в которой связь ПравоРольПользователь многие ко многим)

Понятно, что если бы не нужно быль выдавать права отдельным пользователям, минуя роли - то это можно было бы сделать через hasAnyAuthority

Интересовало, можно ли это сделать стандартными средствами spring security
Сейчас пытаюсь понять подойдет ли hasPermission
25 апр 19, 18:50    [21871971]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Aghial
Member

Откуда:
Сообщений: 18
Sergunka,

Спасибо за ответ!
К сожалению этот рецепт не подойдет в моей конкретной ситуации
25 апр 19, 18:50    [21871973]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Aghial
Member

Откуда:
Сообщений: 18
chpasha,

Смысл отдельных прав - возможность гибкой кастомизации
1 Право - по сути - доступ к одному рест-сервису - доступ к отдельной, конкретной функциональности. И можно этим гибко управлять выдавая как отдельным ролям этом право, так и напрямую пользователю (по количеству ролей тоже есть ограничение и нельзя их плодить без веской на это причины)

Я собственно реализовал это через кастомную аннотацию, без использования spring security
(тут еще допущение, что пользователь - приходит уже аутентифицированным (через заголовок http запроса)), и эта аннотация проверяла запрос на валидность, по заголовку пользователя определяла - есть ли у пользователя такое-то право напрямую или через роль - и давала доступ или отменяла его.
На что мне указали - что стоит рассмотреть использование spring security - и я пытаюсь понять возможно ли это сделать из коробки, ну и попутно разбираюсь с технологией
25 апр 19, 18:59    [21871980]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38540
Aghial
Пользователь1, Пользователь2
Роль1, Роль2
Пользователь 1 входит в состав Роль1
=== ему назначена роль
https://ru.wikipedia.org/wiki/Управление_доступом_на_основе_ролей

Право1(доступ к очень важной информации)
==== почему не сделать CREATE ROLE TOP_SECRET1

Чем не подходит?
25 апр 19, 19:08    [21871986]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38540
Aghial
chpasha,

Смысл отдельных прав - возможность гибкой кастомизации
1 Право - по сути - доступ к одному рест-сервису

вот оно что.
Ты перепутал или свелосипедил Мандатную модель управления доступом.
Там секретность ставится на ресурс. А в системе ролей этого нету.
25 апр 19, 19:11    [21871989]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38540
Aghial
из коробки
мандатная из коробки в Оси Астра линукс производство РФ )))
25 апр 19, 19:12    [21871991]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
chpasha
Member

Откуда:
Сообщений: 7794
Aghial
Смысл отдельных прав - возможность гибкой кастомизации

мне понятен смысл отдельных прав

Aghial
я пытаюсь понять возможно ли это сделать из коробки, ну и попутно разбираюсь с технологией

так как ты это описал - вообще никаких проблем. нужно просто выгрести запросом все права, которые пользователь имеет напрямую и через членство в группах (ролях). В чем проблема? А дальше везде только на права и проверяешь. Мне кажется тут имеет место путаница в понятиях, особенно потому что в спринге по умолчанию все "права" имеют префикс ROLE_XXX но это именно что права, а не роли (группы) - по крайней мере конкретно в твоем случае (префикс кстати поменять можно)
25 апр 19, 19:12    [21871992]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38540
chpasha
но это именно что права, а не роли (группы)
там нет наследования ролей?
25 апр 19, 19:15    [21871993]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Sergunka
Member

Откуда:
Сообщений: 1775
https://astralinux.ru/products/astra-linux-common-edition/

Вообще мне кажется надо идти от заказчика. И посмотреть какая схема авторизации т.е. кто выступает в качестве IdP (Identity Provider).

Что там под капотом SAML, LDAP, OAuth2 или свой протокол?

Задача сама по себе очень интересная судя по тому какая в целом каша в индустрии. У меня как раз период вопросов по секьюрити я бы с удовольствием посмотрел может бы чего подсказал.
25 апр 19, 21:28    [21872066]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
chpasha
Member

Откуда:
Сообщений: 7794
Petro123
там нет наследования ролей?

что есть наследование ролей? типа роль админ - наследник роли юзер или как?
25 апр 19, 22:30    [21872091]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Aghial
Member

Откуда:
Сообщений: 18
Petro123,

Свелосипедил)) Да и, имхо, - это лежит на поверхности

Создавать отдельную роль TOP_SECRET_ROLE - не хочется, так как по сути есть штатно зафиксированный состав ролей, и создавать роль для одного права - не хотелось
Хотя, конечно, я прихожу к выводу что это правильно - и не стоит использовать хак с выдачей permission помимо роли

И спасибо за ссылки на MAC и RBAC - так понятнее
26 апр 19, 10:09    [21872286]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Aghial
Member

Откуда:
Сообщений: 18
chpasha,

Да я собственно так и сделал в какой-то момент, выгреб все права и проверял их наличие в hasAuthority.
Вот только в режиме дебага - там были не права, а роли с префиксом ROLE_, немного не те данные и это смутило

Спасибо, вроде бы более менее возникло понимание, буду пробовать
26 апр 19, 10:11    [21872293]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38540
chpasha
Petro123
там нет наследования ролей?

что есть наследование ролей? типа роль админ - наследник роли юзер или как?
в оракле в ide прямо видно дерево. Очень удобно.
Можно сделать внизу мелкие, а вверху обобщенные (НАЧАЛЬНИК управления).
И одной строкой навешать на любого юзверя.
USER petro SET ROLE super_owner
26 апр 19, 10:22    [21872309]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38540
Sergunka,
Аутентификация на основе утверждений.
MS перешел недавно. Как раз для веб.
https://stackoverflow.com/questions/6786887/explain-claims-based-authentication-to-a-5-year-old
26 апр 19, 10:29    [21872317]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
chpasha
Member

Откуда:
Сообщений: 7794
Petro123
в оракле в ide прямо видно дерево. Очень удобно.

дело в том что спрингу все равно - у спрингового юзера линейный список предоставленных полномочий, по сути это просто коллекция строк (за фасадом интерфейса GrantedAuthority) . Загружай его как хош, из дерева, из файла, хоть как. И организуй тоже как хош.
26 апр 19, 10:56    [21872339]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38540
chpasha,
Такое можно?
claims : [
    {"type": "name", "value": "Jon Snow"},
    {"type": "home", "value": "Winterfell, The North, Westeros"},   
    {"type": "email", "value": "jon@nightswatch-veterans.org"},
    {"type": "role", "value": "veteran;deserter;"},
    {"type": "department", "value": "none"},    
    {"type": "allowEntry", "value": "true"},
    {"type": "access", "value": "castleblack;eastwatch;"}
]
26 апр 19, 11:05    [21872354]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
chpasha
Member

Откуда:
Сообщений: 7794
Petro123
Такое можно?

можно
26 апр 19, 11:40    [21872403]     Ответить | Цитировать Сообщить модератору
 Re: Spring security - ограничения доступа к REST в разрезе пользователя/группы/права  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
Petro123
chpasha,
Такое можно?
claims : [
    {"type": "name", "value": "Jon Snow"},
    {"type": "home", "value": "Winterfell, The North, Westeros"},   
    {"type": "email", "value": "jon@nightswatch-veterans.org"},
    {"type": "role", "value": "veteran;deserter;"},
    {"type": "department", "value": "none"},    
    {"type": "allowEntry", "value": "true"},
    {"type": "access", "value": "castleblack;eastwatch;"}
]

Я-бы развернул на 90 градусов так. +Еще есть специальные литералы для булевых и пустых значений.
claims : {
    "name" : "Jon Snow",
    "home":  "Winterfell, The North, Westeros",   
    "email":  "jon@nightswatch-veterans.org",
    "role":  "veteran;deserter;",
    "department":  null,    
    "allowEntry":  true,
    "access":  "castleblack;eastwatch;"
}
26 апр 19, 12:25    [21872503]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить