Широ
Apache Shiro - это легкая структура аутентификации и авторизации. По сравнению с Spring Security, он прост и прост в использовании и имеет высокую гибкость. Сам Springboot обеспечивает поддержку безопасности, в конце концов, это его собственное дело. Springboot не интегрирует Широ на данный момент, поэтому вы должны соответствовать ему самостоятельно.
1. Добавьте зависимости
<depervice> <groupid> org.apache.shiro </groupid> <artifactid> shiro-spring </artifactid> <serse> 1.2.5 </version> </degifacty> <dehyed> <groupid> org.apache.shiro </GroupD> <ratifactid> shiro-ehcache </artifactid> <sers> 1.2.
2. Напишите класс конфигурации Shiro
пакет com.xbz.web.system.config; Импорт at.pollux.thymeleaf.shiro.dialect.shirodialect; Import org.apache.shiro.authc.credential.credentialsmatcher; Импорт org.apache.shiro.authc.credential.hashedcredentialsmatcher; Import org.apache.shiro.cache.ehcache.ehcachemanager; Импорт org.apache.shiro.codec.base64; Импорт org.apache.shiro.session.sessionListener; Импорт org.apache.shiro.session.mgt.sessionManager; Импорт org.apache.shiro.session.mgt.eis.memorysessiondao; Импорт org.apache.shiro.session.mgt.eis.sessiondao; Import org.apache.shiro.spring.lifecyclebeanpostprocessor; Импорт org.apache.shiro.spring.security.interceptor.authorizationattributesourceadvisor; Импорт org.apache.shiro.spring.web.shirofilterfactorybean; Импорт org.apache.shiro.web.mgt.cookieremembermemanager; Import org.apache.shiro.web.mgt.defaultwebsecuritymanager; Импорт org.apache.shiro.web.servlet.simplecookie; Import org.apache.shiro.web.session.mgt.defaultwebsessionManager; Import org.springframework.aop.framework.autoproxy.defaultadvisorautoproxycreator; Импорт org.springframework.boot.autoconfigure.condition.condition.conditionalonmissingbean; Импорт org.springframework.context.annotation.bean; Импорт org.springframework.context.annotation.configuration; Импорт org.springframework.context.annotation.dependson; импортировать java.util.arraylist; Импорт java.util.collection; импортировать java.util.linkedhashmap; импортировать java.util.map; /*** Класс конфигурации Shiro* Apacheshiro Core реализует управление разрешением и перехват через фильтр, точно так же, как Springmvc использует DispachServlet для управления распределением запросов. * Поскольку он использует фильтр, то есть фильтрацию и проверку разрешений в соответствии с правилами URL, нам необходимо определить серию правил и права доступа к URL* / @configuration public Class ShiroConfiguration { / *** DefaultAdvisorautoproxycreator, Bean of Spring и советник решает, какие классы методов AOP Proxy. */ @Bean @conditionalonmissingbean public defaultadvisorautoproxycreator defaultadvisoroproxycreator () {defaultadvisoroproxycreator defaultaap = new DefaultAdvisoroProxycreator (); defaultaap.setProxyTargetClass (true); вернуть defaultaap; } /*** ShirofilterFactorybean: Для создания Shirofilter, обрабатывать файлы перехвата ресурсов. * В основном он поддерживает три пункта данных, SecurityManager, Filters, FilterChainDefinitionManager. Примечание: единая конфигурация ShirofilterFactorybean IS IS или сообщает об ошибке, потому что при инициализации ShirofilterFactorybean необходимо ввести: SecurityManager * * FilterChain Определение Описание * 1. URL может настроить несколько фильтров, разделенных запятыми * 2. * */ @Bean public shirofilterfactorybean shirofilterfactorybean () {shirofilterfactorybean shirofilterfactorybean = new shirofilterfactorybean (); shirofilterfactorybean.setsecuritymanager (SecurityManager ()); ShirofilterFactoryBean.SetLoginurl ("/login"); // Не устанавливайте страницу login.jsp в корневом каталоге веб -проекта shirofilterfactorybean.setsuccessurl ("/index"); // Подключение к прыжкам после входа в систему является успешным shirofilterfactorybean.setUnauthoriDurledUrliRL (/403 "//403"//403 "//403"//403 "//403"/403 "/403"/403 "/403"/403 "/403"/403 // пользовательский перехватчик, настройки для нескольких фильтров*// map <string, filter> filters = new LinkedHashmap <> (); // LogoutFilter LogoutFilter = new LogoutFilter (); // Ограничение количества онлайн -номеров одной и той же учетной записи одновременно. или отдельный вход и т. Д. // logoutfilter.setredirecturl ("/login"); // filters.put ("logout", null); // shirofilterfactorybean.setfilters (фильтры); Map <string, string> filterChainDefinitionMap = new LinkedHashMap <> (); // FilterChainDefinitionManager должен быть LinkedHashmap, потому что он должен обеспечить упорядоченную FilterChainDefinitionMap.put ("/css/**", "Anon"); // Статические ресурсы не требуют разрешений, если есть файлы в других каталогах (например, JS, IMG и т. Д.) И FilterChainDefinitionMap.Put ("/", "Anon"); FilterChainDefinitionMap.put ("/login", "Anon"); // Настроить часть URL FilterChainDefinitionMap.put ("/logout", "logout"); FilterChainDefinitionMap.put ("/user/**", "Authc, Roles [role_user]"); // Пользователь - роль доступа ROLE_USER. Роль пользователя контролирует поведение пользователя. FilterChainDefinitionMap.put ("/Events/**", "Authc, Roles [role_Admin]"); // filterChainDefinitionMap.put ("/user/edit/**", "authc, perms [user: edit]"); // Для тестирования мертвое значение фиксируется, и его также можно прочитать из базы данных или других конфигураций. Здесь разрешения используются для управления FilterChainDefinitionMap.put ("/**", "authc"); // ресурсы, которые необходимо войти в систему, обычно помещают /** внизу shirofilterfactorybean.setFilterChainDefinitionMap (FilterChainDefinitionMap); вернуть shirofilterfactorybean; } // региональные файлы cookie и session // ============================================================================================ /** Управление объектами cookie*/public simpleecookie momplymecookie () {// Этот параметр является названием cookie, соответствующего имени флажести на переднем конце = homameme simpleecookie simpleecookie = new Simpleecookie (cookie_name); SimpleCookie.SetMaxage (604800); // Запомнить, что мое печенье вступает в силу в течение 7 дней, а устройство возвращается SimpleCookie; } / ** Объект управления cookie: запомнить меня функцию* / public cookieremembermemanager momplymemanager () {cookieremembermemanager cookieemembermemanager = new cookieremembermemanager (); cookieremembermemanager.setcookie (momplymecookie ()); cookieremembermemanager.setcipherkey (base64.decode ("3avvhmflus0kta3kprsdag ==")); // Запомнить ключ шифрования печенья предполагает, что каждый элемент является различным по умолчанию ключа AES; } @Bean sessiondao sessiondao () {return new memorysessiondao (); } @Bean public SessionManager SessionManager () {defaultWebsessionManager SessionManager = новый defaultWebsessionManager (); Collection <sessionListener> Слушатели = новый ArrayList <> (); Слушатели.add (new BdsessionListener ()); SessionManager.setsessionListeners (слушатели); SessionManager.setSessionDao (SessionDao ()); return SessionManager; } // ==================== Cookie и управление сеансами ====================== /EndRegion /*** Manager: Manage Manager транзакции безопасности, управление разрешениями* Сочетает вход в систему, вход в систему, разрешения и обработку сессий. Это относительно важный класс. */ @Bean (name = "securitymanager") public defaultwebsecuritymanager securitymanager () {defaultwebsecuritymanager SecurityManager = новый DefaultWebsecurityManager (); SecurityManager.SetRealm (ShiroRealM ()); SecurityManager.SetCachEmanager (ehcachEmanager ()); /////////MEARLEARISTION/Кэш информации о аутентификации, используя кэш EHCACHE // пользовательское управление сеансом использует Redis SecurityManager.setSessionManager (SessionManager ()); // Inject Помните моего менеджера; SecurityManager.SetRememberMemanager (momplyMemanager ()); Return SecurityManager; } /**. */ @Bean @dependson ("LifeCyclebeanpostProcessor") Public ShiroRealm ShiroRealm (CredentialSmatcher Matcher) {shiroRealm realm = new ShiroRealm (); RealM.SetCredentialSmatcher (Matchter); // Проверка пароля реализует Rearule Realm; } /*** ehcachemanager, cachemanager* После успешного входа пользователя входит в систему, кэширует информацию пользователя и информацию о разрешении, а затем каждый раз, когда пользователь запрашивает, вставьте ее в сеанс пользователя. Если этот фасоль не установлен, база данных будет запрашивать один раз для каждого запроса. */ @Bean @dependson ("LifeCyclebeanpostProcessor") public ehcachemanager ehcachemanager () {ehcachemanager em = new ehcachemanager (); em.setcachemanagerconfigfile ("classpath: config/ehcache.xml"); // Путь файла конфигурации return em; } /** * LifeCyclebeanpostProcessor, это подкласс DestructionAwarebeanpostProcessor, * отвечает за жизненный цикл org.apache.shiro.util.initializable Type Bean. * В основном подкласс класса AuthorizingRealm, а также класс EhcacheManager. */ @Bean (name = "lifecyclebeanpostprocessor") public lifycyclebeanpostprocessor liecyclebeanpostprocessor () {return new LifeCyclebeanpostProcessor (); } /** * hashedcredentialSmatcher, этот класс предназначен для кодирования пароля, * предотвращение четкого хранимых паролей в базе данных. Конечно, при входе на аутентификацию * этот класс также несет ответственность за кодирование паролей, введенных в форме * Процесс сопоставления аутентификации обработки: если настройка требует наследия хэсседкредс -картчика */ @bean (name = hashedcredentialsmatcher ") publiceScredentian CredentialSmatcher = new HashedcredentialSmatcher (); CredentialSmatcher.sethashalgorithmName ("md5"); // Укажите метод шифрования, и вы также можете добавить кэш здесь. Когда пользователь входит в систему более пяти ошибок входа в систему, пользователь заблокирован. Пользователю запрещено постоянно пытаться войти в учетные данные. CredentialSmatcher.SetStoredCredentialShexExeNed (True); вернуть учетные данные; } /** * Authorizationattributesourceadvisor, класс консультантов, реализованный в Shiro, * Используйте Aopallianceannotationsauthorizingmethodinterceptor внутренне для перехвата методов со следующими аннотациями. */ @Bean Public AuthorizationAttributesourCeadVisor AuthorizationAttributesourceadVisor () {AuthorizationAttributesourceadvisor Advisor = new AuthorizationAttributesourceadvisor (); Advisor.seTecurityManager (SecurityManager ()); вернуть консультант; } // @bean public shirodialect shirodialect () {return new shirodialect (); }} 3. Настройка класса проверки сферы
пакет com.yiyun.web.system.config; Импорт com.yiyun.dao.master.userdao; Импорт com.yiyun.domain.userdo; Импорт com.yiyun.web.common.utils.shiroutils; Импорт com.yiyun.web.system.service.menuservice; Импорт org.apache.shiro.securityutils; Импорт org.apache.shiro.authc.*; Импорт org.apache.shiro.authz.authorizationinfo; Импорт org.apache.shiro.authz.simpleauthorizationinfo; Import org.apache.shiro.Realm.AuthorizingRealm; Импорт org.apache.shiro.session.session; Импорт org.apache.shiro.subject.principalCollection; Импорт org.springframework.beans.factory.annotation.autowired; Импорт java.util.*; / *** Получить информацию о роле и разрешения пользователя*/ public Class ShiroRealm Extens AuthorizingRealm {// Как правило, здесь написано здесь, это обслуживание @Autowired private userdao usermapper; @Autowired частный менедервенсервис; /*** Аутентификация входа вообще говоря, после входа в систему текущему пользователю предоставляется разрешения. Этот шаг основан на DogetauthenticationInfo. Только после информации пользователя вы можете определить, следует ли авторизовать пользователя на основе роли пользователя и информации о авторизации. Therefore, Roles and Permissions here are the two key judgment basis for the user* @param authenticationToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; Userdo user = usermapper.findbyname (token.getusername ()); // Проверьте, есть ли этот пользователь if (user! = Null) {// Если есть, храните этого пользователя в информации аутентификации входа в систему, и нет необходимости сравнивать пароль самостоятельно. Shiro будет выполнять сравнение и проверку паролей для List US <UROLE> rlist = UROLEDAO.FINDROLEBYUID (user.getId ()); // Получить список ролей пользователей <Upermission> plist = upermissionDao.findpermissionbyuid (user.getD ()); // get user ormisse list <string> rolestristsuildlist (user.getid ()); // get user разрешение <string> rolestrest = rolestlist <string> (); //) List <string> ressissionStrist = new ArrayList <string> (); /// Сбор разрешений пользователя для (UROLE ROY: RLIST) {ROLESTRILLIST.ADD (ROLE.GETNAME ()); } for (Upermission upermission: plist) {persinsstrlist.add (upermission.getName ()); } user.setroLestRist (roleStrest); user.setperminsstrlist (persinsstrist); Session Session = SecurityUtils.getSubject (). GetSession (); session.setattribute («Пользователь», пользователь); // Если успешно, поместите его в Session // Если он существует, храните этого пользователя в информации аутентификации входа в систему, и вам не нужно сравнивать свой пароль самостоятельно. Широ будет выполнять проверку сравнения пароля для нас. Вернуть новый SimpleAuthenticationInfo (user, user.getPassword (), getName ()); } return null; } / *** Аутентификация разрешения* Получите информацию о разрешении пользователя, которая заключается в том, чтобы вынести суждения о следующем этапе авторизации, чтобы получить роль текущего пользователя и информацию о разрешении, принадлежащей этим ролям* @param PrincipLuction* @return* / @Override эквивалентный (строковый) principLcollection.fromRealm (getName ()). iterator (). Next (); // string loginname = (string) super.getavailableprincipal (principLucollection); Userdo user = (userdo) principLcollection.getPrimaryPrincipal (); // // Перейдите в базу данных, чтобы проверить, присутствует ли этот объект // user user = null; // В реальных проектах вы можете кэш в соответствии с фактической ситуацией. Если вы этого не сделаете, сам Широ имеет механизм интервала времени и не будет выполнять метод неоднократно в течение 2 минут // user = usermapper.findbyname (loginname); if (user! = null) {// Информация о разрешении Информация о объекте, используется для хранения всех ролей (роль) и разрешений (разрешение) найденного пользователя SimpleauthorizationInfo info = new SimpleAuthorizationInfo (); // infosulation info. info.addroles (user.getroLestestlist ()); // Информация об сборе разрешений пользователя.AddStringPermissions (user.getPerminsstrlist ()); вернуть информацию; } // Возврат NULL, он заставит любого пользователя получить доступ к перехваченному запросу, чтобы автоматически прыгнуть на адрес, указанный UnauthorizedUrl; }}4. Наконец, посмотрите на файл конфигурации EHCache
<? xml version = "1.0" Encoding = "utf-8"?> <ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: nonamespaceSchemalocation = "http://ehcache.orgg/ehccecemalocation =" http://ehcache.orgg/ehccecemalocation = "http://ehcache.orge.orgace.xachcemalocation =" http://ehcache.orge.orgace.xachcemalocation = ". <diskstore path = "java.io.tmpdir /tmp_ehcache" /> <!- Имя: Имя кэша. MAXELEMENTESINMEMORY: Максимальное количество кэш. MaxElementeSondisk: максимальное количество кэшей для жесткого диска. Eternal: независимо от того, является ли объект навсегда действительным, после установки тайм -аут не будет работать. Overflowtodisk: Спасение на диск, временные рамки: устанавливает разрешенное время холостого хода (блок: секунды) объекта до истечения срока его действия. Используется только в том случае, если объект Eternal = false не является постоянно допустимым, необязательный атрибут, значение по умолчанию равно 0, что означает, что время холостого хода бесконечно. Временные секунды: устанавливает время (единица: секунды) объекта до истечения срока его действия. Максимальное время между временем создания и временем отказа. Используется только в том случае, если Eternal = False объект не является постоянно действительным, по умолчанию равна 0., что означает, что время выживания объекта бесконечно. Дисквизийный: сохраняется ли дисковый магазин между перезагрузками виртуальной машины. Значение по умолчанию неверно. Diskspoolbuffersizemb: Этот параметр устанавливает размер кэша диск -магазина (дисковый кэш). По умолчанию 30 МБ. Каждый кэш должен иметь свой собственный буфер. DiskexpiryThreadIntervalseconds: интервал времени выполнения потока диска, по умолчанию 120 секунд. MemoryStoreEvictionPolicy: когда достигнут предел MaxElementsInMemory, EHCache очистит память в соответствии с указанной политикой. Политика по умолчанию - LRU (совсем недавно используется). Вы можете установить его на FIFO (сначала, сначала) или LFU (меньше используются). ClearonFlush: следует ли очистить, когда количество памяти максимально. MemoryStoreEvictionPolicy: три стратегии очистки для ehcache; ФИФО, сначала в первую очередь, это наиболее знакомо для всех, сначала в первую очередь. LFU, менее часто используемый, является стратегией, используемой в приведенном выше примере. Чтобы быть тупым, значит сказать, что это было наименее использовано в истории. Как упомянуто выше, кэшированный элемент имеет атрибут хит, а самое низкое значение попадает из кеша. LRU, наименьший недавно, кэшированный элемент имеет временную метку. Когда кеш -емкость будет заполнена, и вам нужно освободить место для кэширования новых элементов, элемент с самым дальним временем в существующем элементе кэша будет очищен из кэша. -> <defaultCache eternal = "false" maxElementsInmemory = "1000" overflowtodisk = "false" diskpersistent = "false" timeDoidleseconds = "0" timetoliveseconds = "600" MemoryStoreevictionPolicy = "LRU" /> <!-Login Record Cache Block Cache Block для 10 минут-> <Copryc namache = "habycreche =" nabryc ameache = "counchache =" MaxEntrieslocalHeap = "2000" Eternal = "false" timeDoidLeseconds = "3600" timetoliveseconds = "0" OupFlowTodisk = "false" Statistics = "true"> </cache> </ehcache>
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.