1.在Spring的配置文件中开启shiro的注解支持
<!-- 开启shiro框架注解支持 -->
<bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
<!-- 表示必须使用cglib方式为Action创建动态代理对象 -->
<property name="proxyTargetClass" value="true"/>
</bean>
<!-- 配置shiro框架提供的切面类,用于创建代理对象 -->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"></bean>
2.在Action的方法上添加注解,注明调用方法需要的权限
1.下面的注解表示执行StaffAction的deleteBatch方法需要用户具有staff-delete权限
/**
* 批量删除
* @return
*/
@RequiresPermissions("staff-delete")
public String deleteBatch(){
staffService.deleteBatch(ids);
return LIST;
}
3.注意开启注解时,proxyTargetClass要设置为true
<1>该属性默认为false,表示使用JDK提供的动态代理创建目标Action的代理对象,这要求目标类必须对接口编程
<2>这在StaffAction中并不适用,虽然StaffAction实现了接口,但向页面提供的方法并不是用接口定义的,因此若不设置为true将无法代理Action中的方法
<3>设置为true,表示使用cglib进行代理对象的创建,由于cglib是利用继承进行代理,因此对任何类都是适用的
4.当用户不具有权限时,核心过滤器会直接抛出异常,若不捕获则会直接再页面回显,用户不友好,因此要利用表现层框架捕获异常
5.在struts.xml中配置捕获权限不足所抛出的异常,并配置对应的处理页面,注意全局异常要在全局结果集的后面
<global-results>
<result name="login">/login.jsp</result>
<result name="unauthorized">/unauthorized.jsp</result>
</global-results>
<!-- 配置全局异常捕获 -->
<global-exception-mappings>
<exception-mapping result="unauthorized" exception="org.apache.shiro.authz.UnauthorizedException"/>
</global-exception-mappings>