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舔痪、部分過濾器可指定參數(shù)津滞,如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"); // 登錄成功后要跳轉(zhuǎn)的連接
factoryBean.setUnauthorizedUrl("/");
loadShiroFilterChain(factoryBean);
return factoryBean;
}
/**
* 加載ShiroFilter權(quán)限控制規(guī)則
*/
private void loadShiroFilterChain(ShiroFilterFactoryBean factoryBean) {
/** 下面這些規(guī)則配置最好配置到配置文件中 */
Map<String, String> filterChainMap = new LinkedHashMap<String, String>();
/**
* authc:該過濾器下的頁面必須驗證后才能訪問灼伤,它是Shiro內(nèi)置的一個攔截器 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孔祸,這個類是為了對密碼進行編碼的,防止密碼在數(shù)據(jù)庫里明碼保存发皿,當然在登陸認證的生活吕朵,
* 這個類也負責對form里輸入的密碼進行編碼形入。
* 3.ShiroRealm弃甥,這是個自定義的認證類斋枢,繼承自AuthorizingRealm,負責用戶的認證和權(quán)限的處理玄货,可以參考JdbcRealm的實現(xiàn)皇钞。
* 4.EhCacheManager,緩存管理松捉,用戶登陸成功后夹界,把用戶信息和權(quán)限信息緩存起來,然后每次用戶請求時隘世,放入用戶的session中可柿,
* 如果不設置這個bean,每個請求都會查詢一次數(shù)據(jù)庫丙者。
* 5.SecurityManager复斥,權(quán)限管理,這個類組合了登陸械媒,登出目锭,權(quán)限,session的處理滥沫,是個比較重要的類侣集。
* 6.ShiroFilterFactoryBean,是個factorybean兰绣,為了生成ShiroFilter。它主要保持了三項數(shù)據(jù)编振,
* securityManager缀辩,filters臭埋,filterChainDefinitionManager。
* 7.DefaultAdvisorAutoProxyCreator臀玄,Spring的一個bean瓢阴,由Advisor決定對哪些類的方法進行AOP代理。
* 8.AuthorizationAttributeSourceAdvisor健无,shiro里實現(xiàn)的Advisor類荣恐,
* 內(nèi)部使用AopAllianceAnnotationsAuthorizingMethodInterceptor來攔截用以下注解的方法。
*/
}