解决办法:
把 spring-shiro.xml 中的shiro注解授权配置 复制 到 spring-mvc.xml 的配置中,即可生效。
让我们来细细说明:
不知为何,@RequiresRoles(ControllerUtil.ROOT) 角色验证居然失效了。
网上所说的xml配置也确实有配置:
<!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<!-- 注解授权:AOP式方法级权限检查 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true" />
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
但似乎不起作用。后来看到了一个问答:360问答(毫无广告痕迹)
发现我把spring-mvc和spring-shiro的配置分成两个配置文件来配置了。
在我的web.xml中:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/spring-mybatis*.xml
classpath*:/spring-shiro.xml
classpath*:/spring-aop.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/spring-mvc*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
springMVC的配置和其它配置文件从属于不同的 contextConfigLocation:
第二行和第十七行各有一个<param-name>contextConfigLocation</param-name>
在servlet spring MVC中只配置了一个classpath*:/spring-mvc*.xml,所以我在spring-shiro中配置注解授权在springMVC中是没有效果的!
把上面那段注解授权配置复制到spring-mvc的配置中就可以了。
注意如果不是复制而是剪切的话,那么另一配置文件中的注解授权就会失效了。
另外,这个注解放在类上也是无效的,需要放在方法上。
@RequiresRoles(ControllerUtil.ROOT)// 放在这里是无效的
@Controller
@RequestMapping(PartController.PART_PATH)
public class PartController extends DefaultLogger{
@RequiresRoles(ControllerUtil.ROOT)// 放在方法上是有效的
@RequestMapping("/add")
public String addPart(){
return getPage("add");
}
}
现在,注解授权不通过时就会抛出异常了。