关于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
/**
* 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证
* 配置以下两个bean(DefaultAdvisorAutoProxyCreator和AuthorizationAttributeSourceAdvisor)即可实现此功能
* @return
*/
@Bean
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}

/**
* 开启aop注解支持
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
### 新问题的出现 我们成功进入到了doGetAuthorizationInfo方法了,但是出现了一个新的问题,doGetAuthorizationInfo方法调用了两次,这是为什么?上网查了一下资料,应该把DefaultAdvisorAutoProxyCreator方法注释掉。
1
2
3
4
5
6
7
    //因为这个配置让doGetAuthorizationInfo调用了两次
/* @Bean
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}*/

⭐今天的分享就到这里,我会尽快跟出鉴权服务的设计思路哟!