Предисловие
Широ - это структура разрешения. Для конкретного использования вы можете проверить его официальный веб -сайт http://shiro.apache.org/. Он обеспечивает очень удобную аутентификацию разрешений и функции входа в систему.
В качестве структуры с открытым исходным кодом Springboot должен предоставлять функции, которые интегрируются с Shiro!
Широ раньше использовался в аутентификации проекта. Он используется чаще в Spring MVC и настроен с XML. Это относительно просто и зрелый в использовании Shiro для контроля разрешения. Более того, я всегда ставил сессию Широ в MongoDB. Это больше соответствует оригинальному дизайну намерения MongoDB. В распределенных проектах MongoDB также используется в качестве промежуточного уровня, который используется для легкости решения проблемы синхронизации сеанса в распределенных средах.
С тех пор, как был выпущен Springboot, мой проект может в основном использовать Springboot, а также очень удобно использовать Maven для объединенного централизованного управления. Хотя Springboot также обеспечивает набор систем безопасности разрешений Spring Sepring Security, она относительно не очень полезна, поэтому он еще более удобен для использования Shiro. Интеграция Springboot с Shiro намного проще, чем Spring MVC, по крайней мере, без куча конфигураций XML, которые выглядят более освежающими, поэтому мы начнем интегрироваться дальше.
Метод заключается в следующем:
Первым шагом должен быть сначала добавить зависимости Широ и Монго в Maven. Версия Shiro, которую я использую
<shiro.version> 1.2.3 </shiro.version>
Добавить зависимости:
<dependency> <groupid> org.apache.shiro </groupid> <artifactid> shiro-core </artifactid> <sersive> $ {shiro.version} </version> </rediceS> <depected> <groupid> org.apache.shiro </Groupid> <ratifactid> shiro-web </artifactid> <strifactid> shiro-web </artifactid> <sersion> $ {shiro.version} </version> </deperency> <Dependency> <groupId> org.apache.shiro </GroupId> <artifactid> shiro-spring </artifactid> <sersion> $ {shiro.version} </version> </repertive> <dependency> <groupd> org.apache.shir chyroshir <Strifactid> shiro-spring </artifactid> <sersive> $ {shiro.version} </version> </ardervice> <dependency> <groupid> org.mongodb </GroupId> <ratifactid> mongo-java-driver </artifactid> <serse> 3.0.0 </version> </зависимость> <зависимости> <зависимость> </artifactid> <sersion> 3.0.0 </version> </зависимость> <groupId> org.springframework.data </GroupId> <ArtifactId> Spring-Data-MongoDB </artifactid> <sersive> 1.7.0.Release </version> </depertive>Затем настройте MongoDB в Application.xml или YML
Spring.data.mongodb.host = 127.0.0.1spring.data.mongodb.port = 27017spring.data.mongodb.database = shiro_info
После завершения конфигурации мы начинаем официально писать код аутентификации Shiro, сначала настраиваем сферу аутентификации, наследуя от авторизации Realm
открытый класс Shirodbrealm Extens AuthorizingRealm { / *** Информационная операция пользователя* / private SystemUserService SystemSerservice; public shirodbrealm () {} public shirodbrealm (SystemUserService SystemUserService) {this.SystemuserService = SystemUserService; } / *** Информация о авторизации* / @Override защищенная авторизация. if (null! = info &&! collectionsils.isempty (info.getRoles ()) &&! collections.isempty (info.getStringpermissions ())) {return info; } return null; } / *** Информация об аутентификации* / Защищенная аутентификация Iinfo DogetAuthenticationInfo (AuthenticationToken Authctoken) Throws AuthenticationException {usernamepasswordtoken token = (usernamepasswordtoken) authctoken; String username = token.getusername (); if (username! = null &&! "". key.setloginname (token.getusername ()); key.setPassword (String.valueof (token.getPassword ())); SystemUser user = SystemUserService.login (Key); if (user! = null) {subject usertemp = securityUtils.getSubject (); usertemp.getSession (). setattribute ("userId", user.getId ()); usertemp.getsession (). setattribute ("username", user.getusername ()); вернуть новый SimpleAuthenticationInfo (user.getLoginName (), user.getPassword (), getName ()); }} return null; }}Сессия магазина в репозиторий и реализации MongoDB:
публичный интерфейс ShirosessionRepository { / ** * * @param Session * / void Savesession (сеанс сеанса); ......}MongodbsessionRepository.java
открытый класс MongodbsessionRepository реализует ShirosessionRepository {Private Mongotemplate Mongotemplate; public mongodbsessionRepository () {} public mongodbsessionRepository (mongotemplate mongotemplate) {this.mongotemplate = mongotemplate; } @Override public void savesession (сеанс сеанса) {if (session == null || session.getid () == null) {return; } SessionBean bean = new SessionBean (); bean.setkey (getsessionkey (session.getid ())); bean.setValue (serializeutil.serialize (session)); bean.setprincipal (null); bean.sethost (session.gethost ()); bean.setStarttimeStamp (session.getStartTimeStamp ()); bean.setlastaccesstime (session.getlastaccesstime ()); bean.settimeouttime (gettimeouttime (session.getStarttimeStamp (), session.gettimeout ())); mongotemplate.insert (bean); } ......}Shirosessiondao.java
открытый класс ShirosessionDao Extends AbstractSessionDao { / *** logger* / private Static Final Logger = loggerFactory.getLogger (shirosessionDao.class); / *** Хранение базы данных*/ private shirosessionRepository shirosessionRepository; / ** * @return */ public shirosessionRepository getShirosessionRepository () {return shirosessionRepository; } / ** * * * @param shirosessionRepository * / public void setshirosessionRepository (shirosessionRepository shirosessionRepository) {this.shirosessionRepository = shirosessionRepository; } @Override public void update (сеанс сеанса) бросает неизвестныйсессия Exception {getShirosessionRepository (). } @Override public void delete (Session Session) {if (session == null) {log.error ("Сеанс не может быть null, удалить неудачу"); возвращаться; } Serializable id = session.getid (); if (id! = null) {getshirosessionRepository (). letetesession (id); }} @Override public Collection <session> GetActivesSessions () {return getShiroSessionRepository (). GetAllsessions (); } @Override защищено сериализуемая docReate (сеанс сеанса) {serializable sessionId = this.generatesessionId (session); this.assignSessionId (Session, SessionId); getShirosessionRepository (). Savesession (Session); return SessionId; } @Override защищенный сеанс DoreAdsession (serializable sessionId) {return getShiroSessionRepository (). GetSession (sessionId); }}ХОРОШО! Все основные классы были завершены, и, наконец, напишите конфигурацию для инициализации и настройки Shiro
@ConfigurationPublic Class ShiroConfig {@Resource private mongotemplate mongotemplate; @Resource private SystemUserService SystemUserService; // Это услуга, используемая для определения имени и пароля пользователя @bean public shirofilterfactorybean shirofilter (defaultwebsecuritymanager SecurityManager) {Shirofilterfactorybeanbean ShirofilterFactorybean = new ShirofilterFactorybean ();); shirofilterfactorybean.setsecuritymanager (SecurityManager); shirofilterfactorybean.setloginurl ("/login"); shirofilterfactorybean.setsuccessurl ("/index"); shirofilterfactorybean.setunauthorizedUrl ("/403"); // перехватчик. Map <string, string> filterChainDefinitionMap = new LinkedHashMap <string, string> (); FilterChainDefinitionMap.put ("/static/**", "Anon"); FilterChainDefinitionMap.put ("/ajaxlogin", "Anon"); FilterChainDefinitionMap.put ("/libs/**", "Anon"); FilterChainDefinitionMap.put ("/Images/**", "Anon"); FilterChainDefinitionMap.put ("/logout", "logout"); FilterChainDefinitionMap.put ("/**", "Authc"); ShirofilterFactoryBean.SetFilterChainDefinitionMap (FilterChainDefinitionMap); вернуть shirofilterfactorybean; } public Authorizationattributesourceadvisor Authorizationattributesourceadvisor (DefaultWebsessionManager SecurityManager) {AuthorizationAttributesourceadvisor adv = new AuthorizationAttributesourceadvisor (); Adv.SetSecurityManager (SecurityManager); вернуть Adv; } @Bean public defaultwebsecuritymanager SecurityManager (defaultWebsessionManager SessionManager, Shirodbrealm MyshiroRealm) {defaultWebseCerationManager SecurityManager = новый DefaultWebSecurityManager (); // установить царство. SecurityManager.SetRealm (MyshiRoreAlm); SecurityManager.setsessionManager (SessionManager); Return SecurityManager; } /*** Authentication Realm; (Здесь пропустите SystemUserService в пользовательскую инициализацию Shirodbrealm) * * @return */ @bean public shirodbrealm myshiroRealm () {shirodbrealm myshiroRealm = new Shirodbrealm (SystemuserService); вернуть myshiroRealm; } @Bean Public DefaultWebsessionManager SessionManager (ShirosessionDao ShirosessionDao) {defaultWebsessionManager SessionManager = new DefaulwebsessionManager (); SessionManager.SetGlobalSessionTimeout (1800000L); SessionManager.SetDeleteInvalidsessions (True); SessionManager.setSessionValidationScheduleRenabled (True); SessionManager.setsessionDao (Shirosessiondao); SessionManager.setSessionIdcookieenabled (True); SimpleCookie cookie = new SimpleCookie (shirohttpsession.default_session_id_name); cookie.setttponly (true); cookie.setmaxage (1800000); SessionManager.setsessionIdcookie (cookie); return SessionManager; } @Bean public shirosessiondao shirosessiondao (mongodbsessionRepository shirosessionRepository) {shirosessiondao dao = new ShirosessionDao (); dao.setshirosessionRepository (shirosessionRepository); вернуть Дао; } @Bean mongodbsessionRepository shirosessionRepository () {mongodbsessionRepository resp = new mongodbsessionRepository (mongotemplay); возврат соответственно; }}Задача выполнена. Это просто простая конфигурация. Код был выдержек и изменен из проекта. Что касается того, как использовать его в контроллере и как аутентифицировать с различными разрешениями, этого достаточно, чтобы реализовать его в своем собственном коде.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.