фон
Друзья, которые преобразовались из традиционных монолитных приложений в Spring Cloud, спрашивают меня, как управлять разрешениями микросервиса в рамках Spring Cloud ? Как разумно спроектировать? С большой точки зрения это называется разрешения на обслуживание, которые разделены на три части:用户认证,用户权限и服务校验.
Аутентификация пользователя
Традиционные монолитные применения могут привыкать к существованию сессий. После микросервисов Spring Cloud сеансы могут быть решены с помощью распределенных сеансов, но в конце концов они не являются лучшей стратегией. Некоторые люди начали внедрять Spring Cloud Security в сочетании с OAuth2 , которая хорошо известна своим OAuth2. Позже, чтобы оптимизировать проблемы с хранением Access Token в OAuth 2 и улучшить доступность и масштабируемость сервисных услуг, существует лучший метод проверки токенов JWT (JSON Web Token). Здесь одна вещь, которую нужно подчеркнуть, это то, что OAuth2 и JWT совсем не сопоставимы, это две совершенно разные вещи.
OAuth2是一种授权框架, в то время как JWT является протоколом аутентификации
OAuth2 Среда аутентификации OAuth2 содержит четыре роли:
OAuth2 содержит 4 режима авторизации
Среди них процесс работы OAuth2 показан на рисунке ниже, выдержка из RFC 6749:
+--------++------------------------+| |-(а)-запрос на авторизацию-> | Ресурс || | | | | Владелец || | <-(b)-грант авторизации --- | || | +------------------------+| || | +-------------------+| |-(c)-грант авторизации-> | Авторизация || Клиент | | | Сервер || |<-(D)--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----->| Ресурс || | | Сервер || <-(f) --- Защищенный ресурс --- | |+--------++-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
В Spring Cloud OAuth2 все запросы на доступ к ресурсам микросервиса несут токены в заголовке HTTP. Доступный сервис затем попросит сервер авторизации проверить обоснованность токена. Таким образом, нам нужно两次或者更多次запросов. Все проверки достоверности токенов падают на сервер авторизации, который стал очень большим узким местом для горизонтального расширения нашей системы.
Протокол сертификации JWT
授权服务器сериализует информацию пользователя и область авторизации и помещает строку JSON, затем использует Base64 для кодирования и, наконец, подписывает строку с закрытым ключом на сервере авторизации для получения JSON Web Token .
Предполагая, что все другие серверы ресурсов будут иметь публичный ключ RSA. Когда сервер ресурсов получает запрос, чтобы иметь токен в заголовке HTTP, сервер ресурсов может получить токен и проверить, использует ли он правильную подпись частного ключа (независимо от того, был ли он подписан авторизованным сервером, то есть проверка подписи). После прохождения проверки допустимая информация о проверке, содержащаяся в Toekn, будет получена после десериализации.
Среди них основная блок -схема операции заключается в следующем:
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
С помощью приведенного выше метода мы можем хорошо завершить аутентификацию пользователей на основе сервисов.
Пользовательские разрешения
Каждый любит shiro для блокирования разрешений традиционных приложений с одним телом, и это довольно проще в использовании. Но после расщепления разрешения начинают разбросаны по различным API. shiro все еще работает? В проекте я не использовал shiro . После того, как передние и задние концы разделены, взаимодействие является токеном, сервисы бэкэнд не имеют состояния, кнопки переднего интерната получают ресурсы, и где мы можем управлять разрешениями?
Аннотация и дизайн
Прежде чем ввести гибкий дизайн Core, позвольте мне представить вам концепцию предварительного просмотра: RBAC (контроль доступа на основе ролей, контроль доступа на основе ролей), что означает, что пользователи ассоциируют с разрешениями с помощью ролей. Проще говоря, у пользователя есть несколько ролей, и у каждой роли есть несколько разрешений.
RBAC на самом деле является аналитической моделью, в основном разделенной на: базовую модель RBAC0 (Core RBAC), иерархическая модель ролевой иерархической модели RBAC1 (иерархальный RBAC), модель ограничения роли RBAC2 (ограничение RBAC) и унифицированная модель RBAC3 (комбинация RBAC).
Основной UML
Это абстрактная диаграмма отношений с RBAC после нескольких сценариев бизнеса
Класс описание
Группа
Группа или группа, коллекция с определенным количеством разрешений, также может быть носителем разрешений.
子类: пользователь (пользователь), роль (роль), позиция (post), единица (отдел). Благодаря конкретному составу пользователя, формируются группы или группы различных бизнес -сценариев, а разрешения пользователей получаются путем авторизации родительскому классу группы или группы.
Разрешение
Разрешения, интеграция с определенным количеством ресурсов, также могут быть носителем ресурсов.
Ресурсы
Существуют ресурсы в разрешении, а источники ресурсов включают: меню (меню), кнопку (разрешение на действие), элементы страницы (кнопка, вкладка и т. Д.), Разрешения данных и т. Д.
Программа
Программы, перевозчик рендеринга для контроля соответствующих разрешений, могут быть установлены в нескольких меню.
Основная композиция общих веб -программ
Взаимосвязь между моделью и микросервисами
Если все интерфейсы API после Spring Cloud Service определены как Resources выше, то мы можем увидеть такую ситуацию.
Например, если пользователь добавляет, удаляет, модифицирует и проверяет, наша страница сделает это.
| Элементы страницы | Кодирование ресурсов | Ресурс URI | Метод запроса ресурса |
|---|---|---|---|
| Запрос | user_btn_get | /api/user/{id} | ПОЛУЧАТЬ |
| Увеличивать | user_btn_add | /API/пользователь | ПОЧТА |
| редактировать | user_btn_edit | /api/user/{id} | ПОМЕЩАТЬ |
| удалить | user_btn_del | /api/user/{id} | УДАЛИТЬ |
После абстрагирования вышеупомянутых отношений сопоставления, наши ресурсы переднего и заднего коэффициента ссылаются, что облегчает нам разрешение группы пользователей. Например, я предоставляю разрешение пользователя на добавление и удаление. В前端нам нужно только проверить, существует ли资源编码или не управлять дисплеем и скрывать кнопки, в то время как в后端нам нужно только равномерно перехватить и определить, имеет ли пользователь URI и соответствующий请求方式.
Что касается того, находится ли единый перехват разрешения на шлюз Zuul или на перехватчик конкретной бэкэнд -службы (фильтр, Inteceptor), его можно легко реализовать. Не ограничивается инвазивностью кода. Блок -схема размещения Zuul заключается в следующем:
Если единый перехват разрешений будет помещен на Zuul , возникнет проблема, то есть независимо от того, является ли защитная служба безопасна, и услуга должна быть вызвана только через регистрационный центр. Это включает в себя третий модуль позади, аутентификацию между услугами.
Аутентификация между услугами
Потому что мы все знаем, что услуги напрямую называются удаленными процедурами после того, как они находят клиента через регистрационный центр. Нам нужно защитить каждый сервис и чувствительный интерфейс в производстве. Процесс темы заключается в следующем:
Метод реализации автора основан на FeignClient Inteceprot Spring Cloud (автоматически применяется к токену Service, пропустите текущий контекст) и Mvc Inteceptor (проверка токена сервиса, обновление текущего контекста) для дальнейшей защиты безопасности Сервиса.
После объединения функций пружинного облака общая блок -схема заключается в следующем:
Точка оптимизации
Несмотря на то, что безопасность интерфейса API обеспечивается благодаря вышеупомянутой проверке законности пользователей, перехвату разрешения пользователя и аутентификации между службами, Http访问频率относительно высока. Когда количество запросов увеличится, проблема慢будет особенно очевидна. Можно рассмотреть некоторые стратегии оптимизации, такие как кэш разрешения пользователя, распределение и смешанное хранение информации о разрешении на обслуживание и регулярное обновление токенов аутентификации услуг.
Заключение
Вышесказанное - моя общая идея в проекте. Заинтересованные друзья могут учиться на моем проекте с открытым исходным кодом. Добро пожаловать в звезду:
- Gitchina: https://gitee.com/minull/ace-security (jwt, разрешения пользователя)
- github: https://github.com/wxiaoqi/ace-security
- gitchina: http://git.oschina.net/geek_qi/ace-gate (аутентификация службы)
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.