關于shiro的架構(gòu)和組件,可以參考開濤跟我學Shiro系列鹤竭。
Shiro初始化
- 初始化DelegatingFilterProxy:
@Bean
public FilterRegistrationBean getShiroFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
// 創(chuàng)建FactoryBean的代理對象
DelegatingFilterProxy delegatingFilterProxy = new DelegatingFilterProxy("shiroFilter");
delegatingFilterProxy.setTargetFilterLifecycle(true);
registrationBean.setFilter(delegatingFilterProxy);
registrationBean.setEnabled(true);
registrationBean.setOrder(2);
registrationBean.addUrlPatterns("/*");
registrationBean.setDispatcherTypes(DispatcherType.REQUEST);
return registrationBean;
}
-
初始化ShiroFilterFactoryBean踊餐,ShiroFilterFactoryBean實現(xiàn)了Spring的FactoryBean,默認會調(diào)用getObject()臀稚,實際調(diào)用createInstance(),實際返回一個SpringShiroFilter對象:
至此吝岭,初始化過程完成,主要構(gòu)造了SpringShiroFilter的對象。
接管request請求
主要搞清楚一件事窜管,Shiro怎么從Spring那里接管到請求散劫?先看一張流程圖:
- 初始化階段生成的DelegatingFilterProxy實現(xiàn)了Servlet的Filter接口;
- 它是一個代理對象幕帆,真正的對象是ShiroFilterFactoryBean获搏。這里是靜態(tài)代理;
- executeChain()方法是核心流程失乾,通過初始化階段的chainResolver解析器解析出自定義的Filter對象常熙,并且開始循環(huán)調(diào)用他們的doFIlter方法。
至此碱茁,shiro就完全接管了web請求裸卫,接下來的章節(jié)會分析如何來攔截這些請求,執(zhí)行認證纽竣,鑒權(quán)的流程墓贿。