shiro见招拆招(其一): (已解决)shiro权限注解@RequireRole和 @RequiresPermissions使用无效解决方案

shiro见招拆招: @RequiresRoles和 @RequiresPermissions使用无效解决方案

    • 前言
    • 场景再现-- @RequiresRoles失效
    • 场景再现-- @RequiresPermissions失效
    • 其他原因
    • 未完待续


前言

最近笔者在做 CMS系统 的时候, 针对安全框架进行选型, 其实说白了就是对shirosecurity进行筛选, 百度一圈, 知乎一圈敲定使用shiro作为安全框架, 和很多人一样, 第一次使用shiro 自然师从涛哥, 从shiro讲解上 涛哥无疑
NO.1(这真不是舔, 谁用谁知道)

场景再现-- @RequiresRoles失效

经过2个小时的细心配置shiro核心文件, 终于可以使用shiro进行登录、非法用户拦截, 可惜, 好景不长 ,当我尝试使用权限注解@RequiresRoles@RequiresPermissions进行一些 细粒度权限控制时, 悲剧发生。。。

@Slf4j
@Controller
@RequiresRoles(value = "超级管理员")
public class AdminController extends BaseController {

上面我的控制器意图是 只有当前该登录用户拥有角色才可以访问, 使用后我心态崩了(一个游客手动输入url,tm都可以访问), 老规矩,求助度娘,度娘给出的方案是 未开启权限注解

于是乎我参考一份大家都给出的开启权限注解配置, 确实有效

<!-- 让RequiresRoles生效 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
   <!--必须 否则shiro就无法解析权限url-->
   <property name="proxyTargetClass" value="true"/>
</bean>

不过, 遇到我这个人才,自然少不了走一些弯路,当时看到别人的解决方案时 立刻不加思索的绝对这个配置应该加载shiro的配置文件中(仔细想想都没毛病,和shiro相关当然放在spring-shiro.xml中)

<import resource="classpath:spring-shiro-cache.xml"/>
<import resource="classpath:spring-shiro.xml"/>

后来才发现 应该加在spring-mvc.xml的配置中, 因为权限注解是需要被拦截扫描的, 而我照搬涛哥的直接将shiro配置文件读取放在ApplicationContext.xml中 所以这里你就应该明白, 如果你将开启权限注解的代码放到spring-shiro.xml中, 肯定没有效果

重新添加到spring-mvc.xml中, 欧克可以使用


场景再现-- @RequiresPermissions失效

就当我以为 开启权限只需要注入上面那个bean就可以时, 我又被shiro玩弄了心态, 事情是这样的

@ResponseBody
@RequiresPermissions("selfset/pass/modify")
@RequestMapping("/selfset/pass/modify")
public String modifyPassword(@Valid AdminVo adminvo, BindingResult bindingResult, HttpServletResponse response) throws Exception

说明: RequiresPermissions(“selfset/pass/modify”)此处的格式我这里是不符合shiro标准的, 应该用冒号分割 第一次使用就随性了

正当我相对 权限在进一步细粒度的鉴权时, 又崩了(游客, 还是能修改密码), 于是乎又去百度(码农就是如此 每天都要和度娘进行近百次的运动, 咳咳 我说的是敲键盘)

解决方案: 再加启动@RequiresPermissions的配置

<!-- 让RequiresRoles生效 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
   <!--必须 shiro就无法解析权限url-->
   <property name="proxyTargetClass" value="true"/>
</bean>

<!--让RequiredPermissions生效-->
<aop:config proxy-target-class="true"></aop:config>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
   <property name="securityManager" ref="securityManager"/>
</bean>

注: 顺序不能颠倒, 至于为什么 笔者的第三次心态崩了就是这, 我的理解是 RequiresPermissions的权限粒度应该来源于RequiresRoles, 如果开启顺序不对, 很有可能导致RequiresPermissions开启失败

其他原因

针对我在网上百度权限开启无效的解决方案 我又做了一个梳理

  • 确保你开启注解后 控制台不报错, 如果报错请先解决控制台报错原因
  • 确保你的shiro.xml 配置文件没有缺少必要配置: 安全管理器配置、Realm配置, 生命周期配置
  • 我给出一个新的思路:如果你上面所述情况你都不存在 那么你很有必要看看你自己写的Realm这个类
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
   log.debug("shiro 授权中...............");
   SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

重点看看这 你是如何授权的,建议授权后,打印你的授权内容,看看注解指定的时候,是不是存在


未完待续

对于我这个犯错大王 ,shiro见招拆招: 其二也不远了, 啊哈哈哈哈哈哈

你可能感兴趣的:(shiro见招拆招)