场景:
spring集成shiro时,在Controller方法上添加注解@RequiresPermissions无效,代码示例如下
@GetMapping("/{id}")
@RequiresPermissions("sys:user:query")
public User user(@PathVariable Long id) {
User user = userDao.getById(id);
return user;
}
解析:
@RequiresPermissions作用是使用shiro权限框架时,用户在正确登入系统后,
当调用带有@RequiresPermissions("sys:user:query")注解的方法是,
系统会直接进入doGetAuthorizationInfo方法进行注入授权信息,为系统权限验证提供权限数据。
doGetAuthorizationInfo是org.apache.shiro.realm.AuthorizingRealm的一个抽象方法,
使用时继承AuthorizingRealmdo在doGetAuthorizationInfo方法类实现自定义授权,
比如从数据库查出权限信息,shiro会使用这些信息进行权限验证.
解决:
1.在springmvc.xml配置文件中加入如下配置信息
<!-- 支持Shiro对Controller的方法级AOP安全控制 2019-3-21 start-->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true" />
</bean>
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.apache.shiro.authz.UnauthorizedException">error/403</prop>
<prop key="java.lang.Throwable">error/500</prop>
</props>
</property>
</bean>
<!-- 支持Shiro对Controller的方法级AOP安全控制 end -->
2.spring-context-shiro.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>
以上,TKS.