интеграция springboot+shiro и базовое приложение

Redis Безопасность Shiro Realm
интеграция springboot+shiro и базовое приложение

Введение

Apache Shiro — это фреймворк безопасности для Java. В настоящее время все больше и больше людей используют Apache Shiro, потому что он достаточно прост, по сравнению со Spring Security может не иметь мощных функций Spring Security, но в реальной работе может и не нуждаться в таких сложных вещах, поэтому используйте небольшие и достаточно простого Широ. Насчет того, что из двух лучше, не надо заморачиваться, лучше было бы проще решить задачу проекта.

Широ может легко разработать достаточно хорошее приложение, которое можно использовать не только в среде JavaSE, но и в среде JavaEE. Широ может помочь нам выполнить: аутентификацию, авторизацию, шифрование, управление сессиями, интеграцию с Интернетом, кэширование и т. д. Здесь я только представляю функции аутентификации, авторизации и шифрования, используемые нашей компанией.Для других функций небольшие партнеры могут использовать свои способность к самообучению.

Здесь давайте разберемся с некоторыми основными терминами сиро.

  1. Аутентификация:

    Аутентификация личности/логин, чтобы проверить, имеет ли пользователь соответствующую личность;

  2. Авторизация:

    Авторизация, то есть проверка разрешений, проверяет, есть ли у аутентифицированного пользователя определенные разрешения, то есть оценивает, может ли пользователь выполнять такие действия, как: проверка наличия у пользователя определенной роли. Или мелкозернистый, чтобы проверить, есть ли у пользователя определенное разрешение на определенный ресурс;

  3. Cryptography:
    Шифрование для защиты безопасности данных, например, пароли шифруются и хранятся в базе данных вместо открытого текста;

  4. Тема:

    Субъект, представляющий текущего «пользователя», этот пользователь не обязательно является конкретным человеком, все, что взаимодействует с текущим приложением, является Субъектом, например, веб-сканеры, роботы и т. д.; то есть абстрактное понятие; все Субъекты связаны SecurityManager, все взаимодействия с субъектом будут делегированы SecurityManager, субъект может рассматриваться как фасад, SecurityManager является фактическим исполнителем;

  5. Менеджер по безопасности:

    Эквивалент DispatcherServlet в SpringMVC или FilterDispatcher в Struts2; это сердце Широ; все конкретные взаимодействия контролируются через SecurityManager; он управляет всеми субъектами и отвечает за аутентификацию и авторизацию, а также за управление сеансом и кешем

  6. Область:

    Домен, Широ получает данные безопасности (такие как пользователи, роли, разрешения) из Realm, то есть SecurityManager должен проверить личность пользователя, затем ему необходимо получить соответствующего пользователя из Realm, чтобы сравнить, чтобы определить, является ли личность пользователя законный; он также должен получить пользователя из Realm. Соответствующая роль/полномочия используются для проверки того, может ли пользователь работать; Realm можно рассматривать как DataSource, то есть безопасный источник данных.

  7. token
    Токен эквивалентен токену, который хэширует некоторую информацию о пользователе (такую ​​как номер счета, пароль и т. д.), а затем генерирует бессмысленную строку и сохраняет ее в базе данных или повторно.Хэш необратим, и пользователь может только войдите в систему путем повторного хеширования Затем получите строку и сравните ее со строкой в ​​базе данных, чтобы увидеть, совпадает ли она, чтобы определить, правильный ли пароль учетной записи

Широ работает процесс

  • Во-первых, давайте посмотрим на Широ со стороны, т.е. с точки зрения приложения, чтобы увидеть, как выполняется работа с Широ.
  1. Код приложения выполняет аутентификацию и авторизацию через Subject, а Subject делегирует SecurityManager;
  2. Нам нужно внедрить Realm в SecurityManager Широ, чтобы SecurityManager мог судить законных пользователей и их разрешения.
  • Подробное объяснение области
    Я полагаю, что после прочтения приведенной выше схемы работы у вас возникнет вопрос --> почему реалм? См. анализ ниже. . . .
    Что касается системы авторизации безопасности, какой пользователь может безопасно входить в систему? Какие пользователи могут войти? Какие права должны быть у такого пользователя? Я считаю, что это знают только разработчики. Realm — это класс, зарезервированный shiro для разработчиков для настройки проверки входа пользователя и авторизации. Мы можем создать собственный класс области, внедрив интерфейс Realm для настройки входа пользователя. Метод аутентификации (заполняется AuthenticationInfo) и проверка авторизации (выполняется AuthorizationInfo)

Аутентификация входа

Я полагаю, что у вас есть некоторое базовое представление о shiro благодаря приведенному выше объяснению, тогда я буду использовать инфраструктуру shiro, упакованную нашей компанией, в качестве примера, чтобы показать вам функции входа и авторизации.

  1. Напишите TokenFilter для аутентификации при входе
    enter description here
    enter description here
  2. Настройте некоторое сопоставление, которое необходимо проверить в файле конфигурации.
    enter description here
    enter description here
  3. Давайте взглянем на один из основных классов в фильтре
    enter description here
    enter description here
  4. Сначала он вызывает метод gettoken и возвращает Token, давайте посмотрим на метод gettoken
    enter description here
    enter description here

    Глядя на код, мы знаем, что этот токен исходит из домена запроса и из информации, заполненной пользователем.
  5. Вернувшись к фильтру, мы найдем такой код
    boolean loginSuccess = this.login(new Token(token));
    Передайте полученный токен в метод входа, затем давайте спустимся сюда и подойдем к другому входу, который имеет это предложение --> subject.login(token);
    enter description here
    enter description here
  6. Введите subject.login(token), и мы найдем такой класс по пути
    enter description here
    enter description here

    В этом методе мы можем найти такое предложение -->info = authentication(token); мы можем обнаружить, что это метод аутентификации, который мы автоматически используем в классе relam косвенного вызова
  7. Перейдем к doGetAuthenticationInfo relam.
    enter description here
    enter description here

    Мы обнаружим, что он использует данные пользователя в качестве ключа, чтобы попытаться получить соответствующее значение в Redis, чтобы доказать, регистрировался ли пользователь когда-либо, или верны ли пароль учетной записи и некоторая информация.

Разрешить

Некоторые понятия об авторизации

основной корпус

Субъект, пользователь, который получает доступ к приложению, представлен Субъектом в Широ. Пользователям разрешен доступ к соответствующим ресурсам только после авторизации.

ресурс

Все, к чему пользователь может получить доступ в приложении, например доступ к странице JSP, просмотр/редактирование некоторых данных, доступ к бизнес-методу, печать текста и т. д., является ресурсом. Пользователи могут получить доступ только после авторизации.

разрешение

Блок атомарной авторизации в политике безопасности, через разрешения мы можем указать, имеет ли пользователь право управлять определенным ресурсом в приложении. То есть разрешения указывают, может ли пользователь получить доступ к ресурсу в приложении, например:
Посетите страницу списка пользователей
Просмотр/добавление/изменение/удаление пользовательских данных (то есть часто используется контроль разрешений типа CRUD (добавление, запрос, изменение и удаление)).
Печать документов и многое другое. . .

Как видно из вышеизложенного, разрешения представляют, имеет ли пользователь право управлять определенным ресурсом, то есть разрешена ли операция, отраженная на определенном ресурсе, или нет, и не отражают, кто выполняет операцию. Поэтому необходимо в дальнейшем давать права пользователям, то есть определять, какому пользователю разрешено делать операции (разрешения) на том или ином ресурсе, Широ этого делать не будет, а будет предоставлено реализатором.
Shiro поддерживает общие разрешения (такие как все разрешения пользовательских модулей) и подробные разрешения (разрешения на работу пользователя, то есть на уровне экземпляра), которые будут представлены в следующих разделах.

Роль

Роль представляет собой набор операций, под которыми можно понимать набор разрешений.В общем случае мы будем давать пользователям роли вместо разрешений, то есть пользователи могут иметь набор разрешений, что более удобно при выдаче разрешений. Типичные примеры: менеджер проекта, технический директор, технический директор, инженер-разработчик и т. д. — это роли, и разные роли имеют различный набор разрешений.

Неявная роль:

То есть напрямую проверить, есть ли у пользователя права на операции через роль.Например, в приложении технический директор, технический директор и инженер-разработчик могут использовать принтер.Предположим, что инженеру-разработчику не разрешено использовать принтер в один прекрасный день. , и соответствующий код нужно удалить из приложения.В приложении технический директор и технический директор могут просматривать пользователей и просматривать разрешения, вдруг в один прекрасный день технический директор не имеет права просматривать пользователей и просматривать разрешения, а роль технический директор должен быть удален из логики суждений в соответствующем коде, то есть гранулярность основана на ролях.Для управления доступом гранулярность относительно грубая, если она изменена, это может привести к многочисленным модификациям кода.

Показать роли:

В программе разрешения используются для контроля того, кто может получить доступ к ресурсу, а роли объединяют набор разрешений; таким образом, если роль не может получить доступ к ресурсу, ее нужно только удалить из набора разрешений, представленного ролью; нет необходимости модифицировать несколько кодов, то есть гранулярность в единицах ресурсов/экземпляров, гранулярность тоньше. ,

Способ авторизации

Shiro поддерживает три способа авторизации:
1. Программно: делается путем написания блока кода авторизации if/else:
Java-код

Subject subject = SecurityUtils.getSubject();  
if(subject.hasRole(“admin”)) {  
    //有权限  
} else {  
    //无权限  
}   

Аннотированный: делается путем размещения соответствующей аннотации в выполняемом методе Java:

Java代码  收藏代码
@RequiresRoles("admin")  
public void hello() {  
    //有权限  
}   

Отсутствие разрешения вызовет соответствующее исключение;

Теги JSP/GSP: заполняются соответствующими тегами на страницах JSP/GSP:
Java-код

<shiro:hasRole name="admin">  
<!— 有权限 —>  
</shiro:hasRole>   

Как наша компания использует shiro для разрешений

  1. Наша компания использует аннотации для управления разрешениями

    enter description here
    enter description here

    Это фрагмент кода, который я вырезал из проекта опроса компании, вы можете видеть --> @RequiresRoles. . . .
    Это означает, что пока у пользователя есть одна из ролей в следующих ролях, этот метод можно использовать.

  2. Давайте посмотрим на метод AuthorizationInfo в области (этот метод используется для идентификации авторизации)

    enter description here
    enter description here

    Мы можем обнаружить, что он сначала получает идентификатор пользователя, затем использует идентификатор пользователя в качестве ключа для поиска значения в Redis, а затем возвращает информацию о разрешениях в информацию.Вам должно быть любопытно, что он получил в Redis.

  3. Посмотрим, что потребуется в Redis

    enter description here
    enter description here

    Мы посмотрели на Redis и обнаружили, что он принимает номер

  4. Это число представляет его роль, и каждая роль имеет разрешения каждой роли.

    enter description here
    enter description here

Это все на сегодня.

Цзэнсинь
Инженер-разработчик Reed Technology Java

Reed Technology-Guangzhou Professional Software Outsourcing Service Company

Предоставить апплет WeChat, исследования и разработки приложений APP, дизайн пользовательского интерфейса и другие профессиональные услуги, уделяя особое внимание консультированию по интернет-продуктам, дизайну бренда, исследованиям и разработкам в области технологий и другим областям,

Посетите www.talkmoney.cn, чтобы узнать больше

Универсальное руководство | Утренний дневник Lite | Bump Wallpaper | Yancai