安全框架 Shiro 配置類 springboot
阿新 • • 發佈:2022-04-06
package org.fh.config; import org.apache.shiro.cache.ehcache.EhCacheManager; import org.apache.shiro.spring.LifecycleBeanPostProcessor; import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.fh.realm.MyShiroRealm; import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; import net.sf.ehcache.CacheManager; import java.util.LinkedHashMap; import java.util.Map;/** * 說明:Shiro 配置 * 作者:FH Admin * from:fhadmin.cn */ @Configuration @EnableTransactionManagement public class ShiroConfiguration { /** * ShiroFilterFactoryBean 處理攔截資原始檔問題 * 注意:單獨一個ShiroFilterFactoryBean配置是或報錯的,因為在 * 初始化ShiroFilterFactoryBean的時候需要注入:SecurityManager * * Filter Chain定義說明 * 1、一個URL可以配置多個Filter,使用逗號分隔 * 2、當設定多個過濾器時,全部驗證通過,才視為通過 * 3、部分過濾器可指定引數,如perms,roles*/ @Bean(name = "shiroFilter") public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean factoryBean = new MyShiroFilterFactoryBean(); factoryBean.setSecurityManager(securityManager); factoryBean.setLoginUrl("/"); // 如果不設定預設會自動尋找Web工程根目錄下的"/login.jsp"頁面 factoryBean.setSuccessUrl("/main/index"); // 登入成功後要跳轉的連線 factoryBean.setUnauthorizedUrl("/"); loadShiroFilterChain(factoryBean); return factoryBean; } /** * 載入ShiroFilter許可權控制規則 */ private void loadShiroFilterChain(ShiroFilterFactoryBean factoryBean) { /** 下面這些規則配置最好配置到配置檔案中 */ Map<String, String> filterChainMap = new LinkedHashMap<String, String>(); /** * authc:該過濾器下的頁面必須驗證後才能訪問,它是Shiro內建的一個攔截器 org.apache.shiro.web.filter.authc.FormAuthenticationFilter * anon:它對應的過濾器裡面是空的,什麼都沒做,可以理解為不攔截 * authc:所有url都必須認證通過才可以訪問; anon:所有url都都可以匿名訪問 */ filterChainMap.put("/404/**", "anon"); filterChainMap.put("/assets/**", "anon"); filterChainMap.put("/admin/check", "anon"); filterChainMap.put("/admin/islogin", "anon"); filterChainMap.put("/admin/register", "anon"); filterChainMap.put("/textextraction/add", "anon"); filterChainMap.put("/**", "authc"); factoryBean.setFilterChainDefinitionMap(filterChainMap); } @Bean public EhCacheManager ehCacheManager(CacheManager cacheManager) { EhCacheManager em = new EhCacheManager(); em.setCacheManager(cacheManager); return em; } @Bean(name = "myShiroRealm") public MyShiroRealm myShiroRealm(EhCacheManager ehCacheManager) { MyShiroRealm realm = new MyShiroRealm(); realm.setCacheManager(ehCacheManager); return realm; } @Bean(name = "lifecycleBeanPostProcessor") public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return new LifecycleBeanPostProcessor(); } @Bean public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator(); creator.setProxyTargetClass(true); return creator; } @Bean(name = "securityManager") public DefaultWebSecurityManager defaultWebSecurityManager(MyShiroRealm realm, EhCacheManager ehCacheManager) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(realm); // 設定realm securityManager.setCacheManager(ehCacheManager); return securityManager; } @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor( DefaultWebSecurityManager securityManager) { AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); advisor.setSecurityManager(securityManager); return advisor; } /* * 1.LifecycleBeanPostProcessor,這是個DestructionAwareBeanPostProcessor的子類,負責org. * apache.shiro.util.Initializable型別bean的生命週期的,初始化和銷燬。主要是AuthorizingRealm類的子類, * 以及EhCacheManager類。 * 2.HashedCredentialsMatcher,這個類是為了對密碼進行編碼的,防止密碼在資料庫裡明碼儲存,當然在登陸認證的生活, * 這個類也負責對form裡輸入的密碼進行編碼。 * 3.ShiroRealm,這是個自定義的認證類,繼承自AuthorizingRealm,負責使用者的認證和許可權的處理,可以參考JdbcRealm的實現。 * 4.EhCacheManager,快取管理,使用者登陸成功後,把使用者資訊和許可權資訊快取起來,然後每次使用者請求時,放入使用者的session中, * 如果不設定這個bean,每個請求都會查詢一次資料庫。 * 5.SecurityManager,許可權管理,這個類組合了登陸,登出,許可權,session的處理,是個比較重要的類。 * 6.ShiroFilterFactoryBean,是個factorybean,為了生成ShiroFilter。它主要保持了三項資料, * securityManager,filters,filterChainDefinitionManager。 * 7.DefaultAdvisorAutoProxyCreator,Spring的一個bean,由Advisor決定對哪些類的方法進行AOP代理。 * 8.AuthorizationAttributeSourceAdvisor,shiro裡實現的Advisor類, * 內部使用AopAllianceAnnotationsAuthorizingMethodInterceptor來攔截用以下註解的方法。 */ }