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來攔截用以下注解的方法, */ }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/456980.html
標籤:Java
上一篇:使用easyExcel注意事項
