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來攔截用以下注解的方法芭商。
*/
}