在SpringMVC中開啟Shiro註解授權的正確方法
阿新 • • 發佈:2019-02-13
臨近年關,不知道是不是大家都空下來了,有時間學習了。最近好幾個好學的童鞋在問我為什麼他們在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,
<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。