关于Shiro不进入doGetAuthorizationInfo方法的解决
微服务的搭建如今到了鉴权模块的开发,之后的文章我会详细告诉大家我鉴权模块是如何设计的,我设计的思路是结合gateway网关,安全框架选择shiro。我了解到的设计思路有两种,一种是把鉴权和网关放在同一个微服务,另一种则是把它拆开,不放在同一个微服务。而公司的项目我是拆分开的,具体如何设计我在下一篇文章告诉大家。
这篇文章我们主要说说shiro的一个点而已,其他的点包括shiroConfig,shiroUtil,自定义Realm这些类的用法这里不一一细说,可能之后我还会发文,只要大家希望我发的我都会第一时间发上来,希望大家多发评论和私信。
⭐现在开始步入正题 ,是不是不少小伙伴在搭建好shrio环境以及把认证的逻辑已经写好以后(这里说的是数据库中的数据),就开始开发授权的模块了,当我们先写假数据测试的时候,奇怪的事情发生了。咦,怎么没有进到授权的代码上呢?就是自定义Realm中继承AuthorizingRealm中的doGetAuthorizationInfo方法。
### 问题原因
在我们登录的时候,我们只是执行认证的方法doGetAuthenticationInfo,但是是没有执行doGetAuthorizationInfo方法的,只有在访问到有权限验证的接口时会调用doGetAuthorizationInfo方法。
### 分析问题
我们在接口中已经加入了如下注解:
1 2
| @RequiresRoles("admin") @RequiresPermissions("admin:*:*")
|
按理说我们在调用这个方法的时候应该会调用doGetAuthorizationInfo方法,但是没有,我就猜想是注解失效。
### 解决问题
在查阅一些如何开启shiro权限注解的资料后,找到了解决方案,就是在shiroConfig配置类中,加入下面代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
@Bean public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){ DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); advisorAutoProxyCreator.setProxyTargetClass(true); return advisorAutoProxyCreator; }
@Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); return authorizationAttributeSourceAdvisor; }
|
### 新问题的出现
我们成功进入到了doGetAuthorizationInfo方法了,但是出现了一个新的问题,doGetAuthorizationInfo方法调用了两次,这是为什么?上网查了一下资料,应该把DefaultAdvisorAutoProxyCreator方法注释掉。
⭐今天的分享就到这里,我会尽快跟出鉴权服务的设计思路哟!