作者:何甜甜在嗎 鏈接:https://juejin.cn/post/6916150628955717646 寫在前面 在介紹具體方案之前,首先先介紹一下常見的加密演算法。加密演算法可以分為三大類: 對稱加密演算法 非對稱加密演算法 Hash演算法 對稱加密演算法 加密和解密使用相同的密鑰。對稱加密演算法加密解密 ...
ckage 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來攔截用以下註解的方法。 */ }