Apache Shiro-это мощная и гибкая структура безопасности с открытым исходным кодом, которая обрабатывает процессы управления безопасностью, обычные в приложениях на уровне предприятия, таких как аутентификация, авторизация, управление сеансами и шифрование на мелкозернистом уровне. Основной целью Apache Shiro является простота использования и понимания. Иногда управление процессом безопасности может быть очень сложным, что является головной болью для разработчиков, но это не обязательно означает это. Фреймворки должны максимально маскировать сложность и разоблачить краткий и интуитивно понятный API, тем самым упрощая работу разработчиков и обеспечивая безопасность их применения. На этот раз мы поговорим о том, как использовать Shiro для реализации контроля разрешений в весенних веб -приложениях.
Функция
Apache Shiro - это комплексная структура безопасности приложений со многими функциями. На следующем рисунке показаны наиболее важные функции в Широ:
Основными целями Широ являются «Четыре краеугольных камня безопасности приложений» - аутентификация, авторизация, управление сеансами и шифрование:
Архитектура
С целостной точки зрения архитектура Широ имеет три основных понятия: субъект (субъект, то есть пользователь), менеджер безопасности (менеджер безопасности) и сферы (домен). На следующем рисунке описывается взаимосвязь между этими компонентами:
Эти компоненты можно понять следующим образом:
Подготовка данных
В веб -приложениях основным контролем над безопасности являются роли, ресурсы и разрешения (какая роль может получить доступ к каким ресурсам). Пользователь может иметь несколько ролей, и роль также может получить доступ к нескольким ресурсам, то есть роль может соответствовать нескольким разрешениям. Чтобы реализовать дизайн базы данных, нам нужно построить не менее 5 таблиц: таблица пользователей, таблица ролей, таблица ресурсов, таблица ролевых ресурсов, таблица с понижением пользователя. Структура этих 5 таблиц заключается в следующем:
Таблица пользователя:
| идентификатор | имя пользователя | пароль |
|---|---|---|
| 1 | Чжан Сан | 123456 |
| 2 | Li Si | 6666666 |
| 3 | Ван Ву | 000000 |
Список ролей:
| идентификатор | Rolename |
|---|---|
| 1 | администратор |
| 2 | менеджер |
| 3 | персонал |
Таблица ресурсов:
| идентификатор | Resname |
|---|---|
| 1 | /пользователь/add |
| 2 | /пользователь/удалить |
| 3 | /Компония/Информация |
Таблица ролевых ресурсов:
| идентификатор | Ророид | Оставшийся |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |
Таблица пользователя:
| идентификатор | ID пользователя | Ророид |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
Соответствующий класс POJO выглядит следующим образом:
/*** пользователь*/public class user {private Integer Id; частное имя пользователя; Private String Password; // Getter & Setter ...} /*** Роль*/Роль публичного класса {Private String ID; Приватная строка Rolename;} /*** Ресурс*/Ресурс открытого класса {Private String ID; Private String Resname;} /*** ROLE-RESORCE*/Public Class Roleres {Private String ID; частная строка Roleid; Частная строка остаточная;} /*** Пользовательский роль*/public Class UserRole {Private String ID; Private String userId; частная строка Roleid;} Для получения подробных шагов по интеграции Spring и Shiro, пожалуйста, обратитесь к моему блогу «Интеграция Apache Shiro в весенних приложениях». Здесь мы добавим: вам нужно заранее представить зависимости Широ, открыть mvnrepository.com и искать Shiro. Нам нужны первые три зависимости, а именно Shiro-Core, Shiro-Web и Shiro-Spring. Приняв проект Maven в качестве примера, добавьте следующие зависимости в рамках узла <dependencies> в pom.xml :
<depervice> <groupid> org.apache.shiro </groupid> <artifactid> shiro-core </artifactid> <serse> 1.4.0 </version> </depervice> <dehydency> <groupid> org.apache.shiro </GroupId> <strifactid> shiro-web </artifactid> <sers> </.4.0 </4.0 </4.0 </4.0 </4.0 </4.0 </4.0 </4.0 </4.0 </4.0 </4.0 </4.0 </4.0 </4.0 </4.0 </4. <groupId> org.apache.shiro </GroupId> <artifactId> shiro-spring </artifactid> <sersive> 1.4.0 </version> </vehyse>
В application-context.xml вам необходимо настройка компонента shiroFilter как это:
<!-Настройка класса Filter Filter Filter, ID-ShiroFilter должен соответствовать фильтрам, которые мы настроили в web.xml-> <Bean id = "shirofilter"> <name = "SecurityManager" ref = "SecurityManager"/> <!-Page Page-> <свойство = "loginurl"/value = "/login"/> <! name = "successUrl" value = "/index"/> <!-Незаконный доступ к скачкованным страницам-> <name = "unauthorizedUrl" value = "/403"/> <!-Конфигурация разрешения-> <name = "filterchaindefinitions"> <value> <!-Статические ресурсы, к которым можно получить без аутентификации, и другие URLS также могут быть добавлены-> an-an-an-an-an-an-antable/an. За исключением ресурсов, проигнорированных выше, все остальные ресурсы должны быть аутентифицированы, прежде чем их можно получить
Далее вам нужно определить сферу. Пользовательская сфера интегрирована из класса AuthorizingRealm :
открытый класс MyRealm Extens AuthorizingRealm {@Autowired Private Userservice Userservice; / *** Разрешение на проверку*/ @Override защищенное авторизацию. if (loginname! = null) {string user userId = securityUtils.getSubject (). getSession (). getAttribute ("useressessionId"). toString (); // Информационный объект разрешения, используемый для хранения всех ролей и разрешений найденного пользователя SimpleAuthorizationInfo info = new SimpleAuthorizationInfo (); // Коллекция пользователей Shirouser Shirouser = (Shirouser) Принципиальная коллекция.getPrimaryPrincipal (); info.setRoles (shirouser.getRoles ()); info.AddstringPermissions (shirouser.getUrlset ()); вернуть информацию; } return null; } / ** * Функция обратного вызова аутентификации, вызов * / Защищенная аутентификация Iinfo DogetAuthenticationInfo (AuthenticationToken Token) {String username = (String) token.getPrincipal (); Пользователь пользователь = новый пользователь (); sysuser.setusername (имя пользователя); try {list <sysuser> users = userservice.findbynames (user); List <string> rolelist = userservice.selectrolenamelistbyuserid (users.get (0) .getid ()); if (users.size ()! = 0) {string pwd = users.get (0) .getPassword (); // После того, как все проверки передаются, поместите информацию пользователя в сеанс сеанса = SecurityUtils.getSubject (). GetSession (); session.setattribute ("usersession", users.get (0)); session.setattribute ("useressessionId", users.get (0) .getId ()); session.setattribute («userroles», org.apache.commons.lang.stringutils.join (rolelist, ",")); вернуть новый SimpleAuthenticationInfo (username, users.get (0) .getPassword ()); } else {// Пользователь не был найден, бросая новый неизвестный inknownAccountexception (); }} catch (Exception e) {System.out.println (e.getMessage ()); } return null; } /*** Обновить кэш информации о авторизации пользователя. */ public void clearcachedAuthorizationInfo (Принципиальные принципы) {super.clearcachedAuthorizationInfo (Принципалы); } /*** Обновите кэш информации пользователя. */ public void clearcachedAuthenticationInfo (Принципиальные принципы) {super.clearcachedAuthenticationInfo (принципалы); } /*** Очистить кэш информации о авторизации пользователя. */ public void clearallcachedAuthorizationInfo () {getAuthorizationCache (). clear (); } /*** Очистить кэш информации пользователя. */ public void clearallCachedAuthenticationInfo () {getAuthenticationCache (). clear (); } / *** Очистить все кэши* / public void clearcache (Принципиальные принципы) {super.clearcache (принципалы); } / *** Очистить все кэши аутентификации* / public void clearallCache () {clearallCachedAuthenticationInfo (); ClearallCachedAuthorizationInfo (); }}Наконец, определите контроллер для входа в систему пользователя, чтобы принять запросы входа в систему пользователя:
@Controllerpublic class usercontroller {/*** user login*/@postmapping ("/login") public String login (@valid пользователь пользователя, BindingResult bindingResult, redirectattributes redirectattributes) {try {if (bindingResult.haserrors ()) {return "; } // Использование инструмента разрешения для аутентификации, после успешного входа в систему, перейдите к успешномурл, определенный в Shirofilter Bean SecurityUtils.getSubject (). Login (новый usernamepasswordtoken (user.getusername (), user.getpassword ())); вернуть "перенаправление: индекс"; } catch (AuthenticationException e) {redirectattributes.addflashattribute («Сообщение», «Имя пользователя ошибки или пароль»); вернуть "перенаправление: вход"; }}/*** logout*/@getmaping ("/logout") public String logout (redirectattributes redirectattributes) {securityUtils.getSubject (). Logout (); вернуть "перенаправление: вход"; }}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.