Безопасность везде. Я воспользовался праздником, чтобы прочитать документы Широ и документировать интеграцию Shiro Spring Boot, чтобы контролировать права доступа на основе ролей в базе данных
Введение
Apache Shiro - мощная, гибкая, открытая структура безопасности. Он занимается аутентификацией, авторизацией, управлением сеансами предприятия и шифрованием.
На рисунке выше показана основная архитектура Широ
Аутентификация
Иногда называют «логин», чтобы доказать, что пользователь является самим пользователем
Авторизация
Процесс управления доступом, то есть определить «кто« доступ », что», что »
Управление сеансом
Управление пользовательскими сеансами. В Shiro вы можете обнаружить, что вся информация о сеансе пользователя будет контролироваться Shiro.
Криптография (шифрование)
Алгоритмы шифрования на источниках данных при обеспечении простоты использования
Начинать
среда
Spring Boot 1.5.9 MySQL 5.7 Maven 3.5.2 Данные Spring JPA Lombok
Добавить зависимости
Здесь даны только основные зависимости от широ
<Depective> <groupId> org.apache.shiro </GroupId> <artifactid> shiro-spring-boot-starter </artifactid> <sersive> 1.4.0-rc2 </version> </dependency>
Конфигурация
Нам нужна только таблица пользователей и таблица ролей в настоящее время. Изменение файла конфигурации в Spring Boot автоматически создаст для нас таблицу базы данных
Сервер: порт: 88888spring: DataSource: Driver-Class-Name: com.mysql.jdbc.driver Имя пользователя: root пароль: root url: jdbc: mysql: // localhost: 3306/shiro?
сущность
Роль. Ява
@Data @entityPublic Class Role {@ID @GeneratedValue Private Integer ID; Приватный длинный пользовательский иид; частная строковая роль;}User.java
@Data @entityPublic Class Пользователь {@ID @GeneratedValue Private Long ID; частное имя пользователя; Private String Password;}Область
Во -первых, создайте класс Realm, наследуйте от авторизации Realm и настройте наши собственные методы авторизации и аутентификации. Realm - это компонент, который может получить доступ к данным безопасности, специфичные для приложения, например, пользователи, роли и разрешения.
Realm.java
Public Class Realm Extens AuthorizingRealm {@Autowired Private Userservice Userservice; // авторизовать @Override защищенную авторизацию. // запрос объекта пользователя на основе пользователя пользователя пользователя = userservice.getuserbyusername (username); // запросить роли, принадлежащие списку пользователей <Sole> list = roleService.findbyuserid (user.getid ()); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo (); для (роли роли: список) {// предоставить пользовательскому роле. } return info; } // Авторизация @Override Protected AuthenticationInfo DogetAuthenticationInfo (AuthenticationToken AuthenticationToken) Throws AuthenticationException {// Получить имя пользователя текущего пользователя string username = (string) authenticationtoken.getPrincipal (); // поиск пользователя из базы данных пользователь пользователь = userservice.getUserbyusername (имя пользователя); if (userservice.getUserbyusername (username) == null) {бросить новый неизвестный kintAccountexception («Соответствующая информация пользователя не была найдена в этой системе»); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo (user.getUsername (), user.getPassword (), getName ()); вернуть информацию; }}Класс конфигурации Shiro
Shiroconfig.java
@ConfigurationPublic Class ShiroConfig {@bean public shirofilterfactorybean shirofilterfactorybean (SecurityManager SecurityManager) {ShirofilterFactorybean ShirofilterFactorybean = new ShirofilterFactorybean (); shirofilterfactorybean.setsecuritymanager (SecurityManager); Map <string, string> filterChainDefinitionMap = new LinkedHashMap <string, string> (); // Ниже приведен цепочка фильтров, фильтрация по порядку, так что/** необходимо поместить последний статический ресурс // open filterchaindefinitionmap.put ("/favicon.ico", "anon"); // web icon filterchaindefinitionmap.put ("/**", "authc"); ShirofilterFactoryBean.SetFilterChainDefinitionMap (FilterChainDefinitionMap); вернуть shirofilterfactorybean; } @Bean public defaultWebseCurityManager SecurityManager () {defaultWebSecurityManager defaultWebSecurityManager = new DefaultWebsecurityManager (myRealm ()); вернуть DefaultWebsecurityManager; } @Bean public myRealm myRealm () {myRealm myRealm = new myRealm (); вернуть MyRealm; }}Контроллер
Usercontroller.java
@Controllerpublic class usercontroller {@autowired private userservice userservice; @Getmapping ("/") public String index () {return "index"; } @Getmapping ("/login") public String tologin () {return "login"; } @GetMapping ("/admin") public String admin () {return "admin"; } @Postmapping ("/login") public String dologin (String username, String password) {usernamepasswordtoken token = new usernamepasswordtoken (username, пароль); Субъект = SecurityUtils.getSubject (); try {subject.login (token); } catch (Exception e) {e.printstackTrace (); } вернуть "redirect: admin"; } @Getmapping ("/home") public String home () {subject = securityUtils.getSubject (); try {subject.checkpermission ("admin"); } catch (unauthorizedException исключение) {System.out.println («Нет достаточных разрешений»); } вернуть "домой"; } @Getmapping ("/logout") public String logout () {return "index"; }}Услуга
Userservice.java
@Servicepublic class userservice {@autowired private userdao userdao; Общественный пользователь getUserbyusername (String username) {return userdao.findbyusername (имя пользователя); } @RequiresRoles ("admin") public void send () {System.out.println ("У меня теперь есть роль администратора, и я могу выполнить этот оператор"); }}Дисплей слой
admin.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> <title> title </title> </head> <body> <form action = "/login"/"method" = "text> </head> <body> <form action ="/login "=" text "=" intext "=" intemply "=" intember '> </intemploy "</head> <body> <form ="/rogin "=" name = "username" /> <input type = "password" name = "password" /> <input type = "Отправить" value = "login" /> < /form> < /body> < /html>
Home.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/>
index.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> <title> title </title> </head> <body> index <a href = "/>" В </a> </body> </html>
Login.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> <title> title </title> </head> <body> <form action = "/login"/"method" = "text> </head> <body> <form action ="/login "=" text "=" intext "=" intemply "=" intember '> </intemploy "</head> <body> <form ="/rogin "=" name = "username" /> <input type = "password" name = "password" /> <input type = "Отправить" value = "login" /> < /form> < /body> < /html>
Суммировать
Этот небольшой случай реализует управление доступом пользователя на основе ролей, наиболее важной из которых является сфера, которая действует как «мост» или «разъем» между Shiro и данными безопасности приложений.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.