Что такое Широ
Shiro - это структура разрешения с открытым исходным кодом для платформы Java для аутентификации и авторизации доступа. В частности, поддерживается поддержка следующих элементов:
В: Поддержка группы?
A: Shiro не поддерживает установку разрешений для групп по умолчанию.
В: Может ли он удовлетворить потребности распределения ролей для групп?
A: Расширение царства может поддерживать назначение ролей группам, которые фактически предназначены для назначения разрешений всем пользователям в рамках группы.
В: Поддержка разрешений на данные? Определяется в бизнес -системе?
A: SHIRO только реализует управление над разрешениями работы, которые используются для скрытия или отображения элементов управления передним контролем и проверки разрешений на доступ к ресурсам. Разрешения на данные тесно связаны с конкретными потребностями бизнеса, и сам Широ не может контролировать разрешения на данные.
В: Динамическое распределение разрешений?
A: Extend org.apache.shiro.Realm.Realm для поддержки динамического распределения разрешений.
В: Интегрировать с пружиной?
A: Он может поддерживать интеграцию с Spring, а Shiro также поддерживает теги JSP.
В предыдущем блоге мы говорили о двух самых больших функциях, аутентификации и авторизации Широ. Одиночный вход также является частью аутентификации. По умолчанию Shiro внедрила интеграцию с CAS для нас, и все будет в порядке, если мы добавим некоторые интегрированные конфигурации.
1. Добавить пакет Shiro-Cas
<!-Широ интегрирует CAS одноцелевую точку-> <Depective> <groupId> org.apache.shiro </GroupId> <ratifactid> shiro-cas </artifactid> <sersion> 1.2.4 </version> </vehyse>
2. Добавить единую конфигурацию в регистрации
Здесь я разместил все конфигурации для легкой ссылки, и в конфигурацию были добавлены подробные инструкции.
пакет com.chhliu.springboot.shiro.config; импортировать java.util.linkedhashmap; импортировать java.util.map; Импорт javax.servlet.filter; Import org.apache.shiro.cache.ehcache.ehcachemanager; Импорт org.apache.shiro.cas.casfilter; Импорт org.apache.shiro.cas.cassubjectfactory; Import org.apache.shiro.spring.lifecyclebeanpostprocessor; Импорт org.apache.shiro.spring.security.interceptor.authorizationattributesourceadvisor; Импорт org.apache.shiro.spring.web.shirofilterfactorybean; Import org.apache.shiro.web.mgt.defaultwebsecuritymanager; Import org.jasig.cas.client.session.singlesignoutfilter; Import org.jasig.cas.client.session.singlesignouthttpsessionListener; Import org.springframework.aop.framework.autoproxy.defaultadvisorautoproxycreator; Импорт org.springframework.boot.web.servlet.filterRegistrationBean; Import org.springframework.boot.web.servlet.servletlistenerregistrationbean; Импорт org.springframework.context.annotation.bean; Импорт org.springframework.context.annotation.configuration; Импорт org.springframework.context.annotation.dependson; Импорт org.springframework.core.ordered; Импорт org.springframework.core.annotation.order; Импорт org.springframework.web.filter.delegatingfilterProxy; /*** Конфигурация Shiro** Apache Shiro Core реализуется через фильтр, так же, как Springmvc использует Dispachservlet для его управления. Поскольку мы используем * фильтр, мы можем, как правило, догадаться, что фильтрация и проверка разрешения осуществляются с помощью правил URL, поэтому нам необходимо определить ряд прав и прав доступа к URL. * * @author chhliu */@configuration public class shiroconfiguration {// cas Server Adder public static final String casserverurlprefix = "http://127.0.0.1"; // Страница CAS вход в систему адрес Public Static Final String Casloginurl = casserverurlprefix + "/login"; // Страница страницы CAS Public Static Final String caslogouturl = casserverurlprefix + "/logout"; // текущий адрес обслуживания, предоставленный проектом для внешней государственной статической статической строки Shiroserverurlprefix = "http://127.0.1.28:8080"; // casfilter urlpattern public static final String casfilterurlpattern = "/index"; // Вход в адрес публичной статической конечной строки loginurl = casloginurl + "? Service =" + shiroserverurlprefix + casfilterurlpattern; // Адрес входа (Casserver включает функцию прыжка с обслуживания, и вам необходимо включить cas.logout.followserviceredirects = true в WebApps/CAS/Web-Inf/CAS.Properties File) Public Static Final String LogoutUrl = caslogouturl+"? Service ="+loginurl; // Вход успешного адреса // public Static Final String LoginSuccessurl = "/index"; // Аутентификация разрешений не удалось jump Адрес публичная статическая конечная строка UnauthorizedUrl = "/Error/403.html"; / ** *Создание SecurityManager, этот класс является основным классом shiro */ @return */ @bean public defaultwebsecuritymanager securitymanager () {defaultwebsecuritymanager securitymanager = new DefaultWebseCerationManager (); SecurityManager.SetRealm (MyShiroCasRealm ()); // <!-Авторизация пользователя/информация о аутентификации, с использованием кэша ehcache-> SecurityManager.SetCachEmanager (getehcachemanager ()); // указать субъектфактор. Если вы хотите реализовать функцию CAM CAS CAS, вам необходимо использовать следующую CassubjectFactory и установить ее на SecurityManager SupationFactory SecurityManager.setSubjectFactory (new CassubjectFactory ()); Return SecurityManager; } / *** Configure Cache* @return* / @bean public ehcachemanager getehcachemanager () {ehcachemanager em = new ehcachemanager (); em.setcachemanagerconfigfile ("classpath: config/ehcache-shiro.xml"); вернуть их; } /*** Настройка царства. Поскольку мы используем CASREALM, единая функция входа была интегрирована * @param cachemanager * @return */ @bean public myshirorealm myshirocasrealm () {myshiroRealm realm = new myshiroRealm (); // CAS вход в систему сервера Prefix RealM.SetCasserverUrlpRefix (shiroConfiguration.casserverurlprefix); // Адрес обратного вызова клиента, адрес прыжка после успешного входа (его собственный адрес обслуживания) Realm.setCasservice (ShiroConfiguration.Shiroserverurlprefix + shiroConfiguration.casfilterUrlpattern); // Роль по умолчанию после входа в систему успешна, здесь по умолчанию пользовательская роль RealM.SetDefaulloles («Пользователь»); вернуть царство; }/ ** * Зарегистрируйте отдельный прослушивание подписки * @return */ @suppresswarnings ({"ravtypes", "unchecked"}) @bean @order (ordered.highest_precedence) // Приоритет выше, чем Cas publiclestredereRegistrationbean <?> NewlesttpessessionListener () {servletlistereRegistratistrationBean beaNeRegistrateRegistrateBeanbeanbeAnregistratistrastrationbea ServletListenerERegistrationBean (); bean.setlistener (new SingleSignouthttpsessionListener ()); Bean.SetEnabled (True); вернуть бон; } / ** * Зарегистрировать одиночный фильтр подписки * @return * / @bean public filterRegistrationbean singleSignoutfilter () {FilterRegistrationBean Bean = new FilterRegistrationBean (); Bean.SetName ("SingleSignoutFilter"); bean.setfilter (new SingleSignoutFilter ()); bean.addurlpatterns ("/*"); Bean.SetEnabled (True); вернуть бон; } / ** * Зарегистрировать DelegatingFilterProxy (shiro) * / @bean public filterRegistrationbean delegatingFilterProxy () {FilterRegistrationBean FileTerRegistration = new FilterRegistrationBean (); FilterRegistration.SetFilter (New ElegatingFilterProxy ("Shirofilter")); // Это значение по умолчанию является ложным, указывая на то, что жизненный цикл управляется SpressApplicationContext. Установлен истин, означает, что сервисконетанер управляется FilterRegistration.AddinitParameter («TargetFilterLifeCycle», «True»); FilterRegistration.SetEnabled (true); FilterRegistration.AddurlPatterns ("/*"); вернуть фильтрующую регистрацию; } / *** Этот класс может убедиться, что метод init или destory объекта Shiro, который реализует org.apache.shiro.util.initializable интерфейс автоматически,* без вручную не указать метод инициализации или метод Destory Method* Примечание: если этот клас «LifeCyclebeanpostProcessor») Public LifeCyclebeanpostProcessor getLifeCyclebeanpostProcessor () {return new LifeCyclebeanpostProcessor (); } /*** Следующие две конфигурации используются в основном для включения поддержки аннотаций Shiro AOP. Используйте метод прокси; Таким образом, вам нужно включить поддержку кода; * @return */ @bean @dependson ("lifecyclebeanpostprocessor") public defaultadvisoroproxycreator getdefaultadvisoroproxycreator () {defaultadvisorautoproxycreator daap = new defaultadvisoroproxycreator (); DAAP.SetProxyTargetClass (true); вернуть DAAP; } / ** * @param securitymanager * @return * / @bean public authorizationattributesourceadvisor getauthorizationattributesourceadvisor (defaultwebsecuritymanager securitymanager) {AuthorizationAttributesourceadvisor Authorizationattributesourceadvisor = new AuturizationAttributeTributeourceadvisor (); Authorizationattributesourceadvisor.setsecurityManager (SecurityManager); вернуть Authorizationattributesourceadvisor; } / *** Filter CAS* @return* / @bean (name = "casfilter") public casfilter getcasfilter () {casfilter casfilter = new casfilter (); casfilter.setname ("casfilter"); casfilter.setEnabled (true); // URL, который прыгает после выхода в систему, то есть, то есть, Shiro выполняет метод CogetAuthenticationInfo Casreealm для проверки Tiket casfilter.setfailureUrl (LoginUrl); // Мы решили открыть страницу входа после того, как аутентификация не удалась casfilter.setloginurl (loginurl); вернуть касфильтер; } / ** * Создать и инициализировать Shirofilter с использованием заводского режима * @param securitymanager * @param casfilter * @return * / @bean (name = "shirofilter") public shirofilterfactorybean getshirofilterfactorybean (defaultwebsecurity manager, casfilter casfilter) Shirofilterfactorybean (); // SecurityManager должен быть установлен ShirofilterFactoryBean.setSecurityManager (SecurityManager); // Если вы не установите по умолчанию, он автоматически найдет страницу «/login.jsp» в корневом каталоге веб -проекта Shirofilterfactorybean.setloginurl (loginurl); / * * Подключение, которое будет перенаправлено после успешного входа. Если он не будет установлен, он по умолчанию вскочит на предыдущий URL. * Например, вы впервые ввели http: // localhost: 8080/userlist в браузере, но теперь пользователь не вошел в систему, поэтому он прыгнет на страницу входа в систему. После того, как аутентификация входа в систему будет проходить, страница * автоматически перейдет на страницу http: // localhost: 8080/userlist вместо страницы индекса после успешного входа в систему. Это поле не рекомендуется быть установленным */ // shirofilterfactorybean.setsuccessurl (loginsuccessurl); // установить несанкционированный доступ к странице ShirofilterFactorybean.SetUnauthorizedURL (unauthorizedUrl); / * * Добавить Casfilter в Shirofilter. Обратите внимание, что Casfilter должен быть размещен перед Shirofilter, чтобы убедиться, что программа будет ввести одноточечную аутентификацию перед входом в систему логина Shiro */ map <string, filter> filters = new LinkedHashmap <> (); filters.put ("casfilter", casfilter); // Вход был заменен на одноточечный журнал // filters.put ("logout", logoutfilter ()); shirofilterfactorybean.setfilters (фильтры); LoadShiroFilterChain (ShirofilterFactoryBean); вернуть shirofilterfactorybean; } /*** Загрузить правила управления разрешением Shirofilter (прочитайте из базы данных и затем настройка), информация о роле /разрешении предоставляется объектом MyshirocasRealm. DogetauthorizationInfo реализация. * This part of the rules will be placed in the database during production* @param shiroFilterFactoryBean */ private void loadShiroFilterChain(ShiroFilterFactoryBean shiroFilterFactoryBean){ //////////////////////////////////////// The following rules are best configured in the configuration file. Обратите внимание, что добавленный здесь фильтр должен быть упорядочен, поэтому используйте LinkedHashmap ////////////////////////////////////////////////////////////////////////// Map <String, String> FileterChaindefinitionmap = new LinkedHashmap <string> (string> ();); FilterChainDefinitionMap.Put (casfilterurlpattern, "casfilter"); // 2. Запросы, которые не перехватывают FilterChainDefinitionMap.Put ("/css/**", "Anon"); FilterChainDefinitionMap.put ("/js/**", "Anon"); FilterChainDefinitionMap.put ("/login", "Anon"); // Здесь установите страницу входа в Anon, а не в систему, потому что вход обрабатывается одной точкой, и его не нужно перехватывать с помощью Shiro's LogoutFilter FilterChainDefinitionMap.put («/logout», «Anon»); FilterChainDefinitionMap.put ("/error", "Anon"); // 3. Перехватываемые запросы (получены из локальной базы данных или из кассервера (удаленные методы, такие как Webservice, HTTP и т. Д.), Смотрите, где настроены ваши разрешения на роли) FilterChainDefinitionMap.put («/user», «Authc»); // Вход требуется // 4. Вход не перехватывает FilterChainDefinitionMap.Put ("/**", "authc"); ShirofilterFactoryBean.SetFilterChainDefinitionMap (FilterChainDefinitionMap); }}Некоторая ссылка на конфигурацию: http://shiro.apache.org/spring.html
3. Напишите царство
Поскольку нам нужно интегрировать функции единого входа, нам нужно интегрировать класс CasRealm. Этот класс реализовал для нас функции аутентификации одной точки. Что нам нужно сделать, так это реализовать функции авторизации. Пример кода заключается в следующем:
пакет com.chhliu.springboot.shiro.config; Импорт javax.annotation.resource; Импорт org.apache.shiro.securityutils; Импорт org.apache.shiro.authc.authenticationInfo; Импорт org.apache.shiro.authc.authenticationtoken; Импорт org.apache.shiro.authz.authenticationInfo; Импорт org.apache.shiro.authz.simpleauthorizationinfo; Импорт org.apache.shiro.cas.casrealm; Импорт org.apache.shiro.subject.principalCollection; импорт com.chhliu.springboot.shiro.mode.syspermission; импорт com.chhliu.springboot.shiro.mode.syspermission; Импорт com.chhliu.springboot.shiro.mode.userinfo; импорт com.chhliu.springboot.shiro.service.userinfoservice; /*** Проверка разрешения класс основной класс; Поскольку используется отдельный вход, нет необходимости аутентифицировать, просто требуется авторизация * * @author chhliu */ public class myshiroRealm Extends casrealm {@Resource private userInfoService userInfoService; / *** 1. Аутентификация CAS, проверьте идентификацию пользователя* 2. Установите базовую информацию пользователя в сеанс для легкого доступа* 3. Этот метод может напрямую использовать метод аутентификации в CasRealm, который используется только в качестве теста*/ @override, защищенной аутентификации, DogetauthenticationInfo (AuthenticationToken Token) {// CALL INTENTINGENTICATITION. CASREALM внедрил для нас единственную точку аутентификации. AuthenticationInfo authc = super.dogetAuthenticationInfo (токен); // Получить регистрацию учетной записи. После успешной аутентификации CAS учетная запись будет сохранена. String account = (string) authc.getPrincipals (). GetPrimaryPrincipal (); // Сохранить пользовательскую информацию в сеансе для легкого приобретения программы. Здесь вы можете поместить запрос информации пользователя на основе учетной записи входа в сеанс SessionUtils.getSubject (). GetSession (). SetAtTribute («Нет», учетная запись); вернуть Authc; } /*** обратный вызов будет выполняться только тогда, когда этот метод вызовет Hasrole и Haspermission. * * Информация о разрешении. (Авторизация): 1. Если пользователь обычно выходит, кэш будет автоматически очищен; 2. Если пользователь выходит из ненормально, кэш будет автоматически очищен; * 3. Если мы изменем разрешения пользователя, но пользователь не выходит из системы, модифицированные разрешения не могут вступить в силу немедленно. (Он должен быть реализован вручную; вставить в эксплуатацию для вызова) * После изменения разрешения изменяется, метод в сфере вызван. Realm управляется весной, поэтому экземпляр Realm получается из Spring, и называется метод Clearcached; *: Авторизация является авторизованным контролем доступа, используемой для авторизации операции, выполняемой пользователем, доказывая, разрешает ли пользователь текущую операцию, такую как доступ к определенной ссылке, определенный файл ресурса и т. Д. * * * @param Конфигурация-> MyshiRorealM.DogetAuthorizationInfo () "); SimpleAuthorizationInfo AuthorizationInfo = new SimpleAuthorizationInfo (); // Получить имя пользователя после единого входа, вы также можете получить его из сеанса, потому что после успешной аутентификации имя пользователя было помещено в сеанс String username = (String) super.getavailableprincipal (Принципы); // Принципы.getPrimaryPrincipal (); Этот метод также может получить имя пользователя // получить роль пользователя и информацию о разрешении на основе имени пользователя userInfo userInfo = userInfoService.findbyusername (username); // Пакет соответствующая роль пользователя и информацию о разрешении в AuthorizationInfo для (Sysrole Role: userInfo.getRolelist ()) {AuthorizationInfo.Addrole (role.getRole ()); для (syspermission p: role.getpermissions ()) {AuthorizationInfo.AddstringPermission (p.getPermission ()); }} return AuthorizationInfo; }} Далее мы можем провести проверку!
Введите http: 127.0.1.28: 8080/userinfo/user-liled в браузере, и мы обнаружим, что он автоматически перепрыгнет на страницу входа в систему с одной точкой.
Затем мы вводим имя пользователя и пароль, и оно автоматически перейдет на страницу HTTP: 127.0.1.28: 8080/userInfo/userList.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.