1. 程式人生 > >在SpringMVC中開啟Shiro註解授權的正確方法

在SpringMVC中開啟Shiro註解授權的正確方法

臨近年關,不知道是不是大家都空下來了,有時間學習了。最近好幾個好學的童鞋在問我為什麼他們在Srping的配置中檔案中配置好了Shiro的註解支援Bean。但是在Controller中通過註解授權的時候就是不能生效。配置如下:

<span style="font-size:14px;"><bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
		  depends-on="lifecycleBeanPostProcessor"/>
	<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
		<property name="securityManager" ref="securityManager"/>
	</bean></span></span>

首先我說,上面的配置是正確的,可是為什麼不生效呢,今天我就來說說這事兒。

我們知道Shiro的註解授權是利有Spring的AOP實現的。在程式啟動時會自動掃描作了註解的Class,當發現註解時,就自動注入授權程式碼實現。也就是說,要注入授權控制程式碼,第一處必須要讓框架要可以掃描找被註解的Class 。而我們的Srping專案在ApplicationContext.xml中一般是不掃描Controller的,所以也就無法讓寫在Controller中的註解授權生效了。因此正確的作法是將這配置放到springmvc的配置檔案中.這樣Controller就可以通過註解授權了。

不過問題來了,通過上面的配置Controller是可以通過註解授權了,但是Services中依然不能通過註解授權。雖然說,如果我們在Controller控制了授權,那麼對於內部呼叫的Service層就可以不再作授權,但也有例外的情況,比如Service除了給內部Controller層呼叫,還要供遠端SOAP呼叫,那麼就需要對Service進行授權控制了。同時要控制Controller和Service,

那麼採用相同的方式,我們可以在ApplicationContext.xml中配置類同的配置,以達到相同的效果。

<bean id="serviceAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
	<bean id="serviceAuthorizationAttributeSourceAdvisor" class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
		<property name="securityManager" ref="securityManager"/>
	</bean>

在springmvc.xml中的配置改為

<bean id="controllerAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
		  depends-on="lifecycleBeanPostProcessor"/>
	<bean id="controllerAuthorizationAttributeSourceAdvisor"  class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
		<property name="securityManager" ref="securityManager"/>
	</bean>


此時,我們在同一個專案中配置了兩個,DefaultAdvisorAutoProxyCreator 和AuthorizationAttributeSourceAdvisor.需要給它們指定不同的ID。