springboot Shiro 配置類

fhadmin發表於2022-01-25
 
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來攔截用以下註解的方法。
	 */
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31558068/viewspace-2853969/,如需轉載,請註明出處,否則將追究法律責任。

相關文章