今天在學(xué)習(xí)Springboot整合shiro的時(shí)候發(fā)現(xiàn)加的關(guān)于權(quán)限的注解攔截不生效
@RequestMapping("/userList")
@RequiresPermissions("userInfo:list")
public String getUserAll(Map map) {}
登陸之后即使當(dāng)前用戶沒有角色和權(quán)限依然可以訪問這個(gè)地址
然后就想到既然這個(gè)注解無效 那就看一下ShiroRealm中的授權(quán)方法中有沒有把當(dāng)前用戶擁有的角色和權(quán)限添加到realm中 之后在這個(gè)方法中下了一個(gè)斷點(diǎn)
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {}
但是無論怎樣都進(jìn)不了這個(gè)方法 上網(wǎng)查了之后知道了這個(gè)方法通常是在以下幾種情況下觸發(fā)
subject.hasRole("xx")或者subject.isPermitted("xx") 調(diào)用方法判斷是否含有某個(gè)角色或者權(quán)限
@RequiresRoles("xx")或者@RequiresPermissions("xx") 在方法上加注解
<shiro:hasPermission="xx" > 在頁面中加入shiro標(biāo)簽
之后又上網(wǎng)重新查詢shiro注解無效發(fā)現(xiàn)在傳統(tǒng)的springmvc+shiro項(xiàng)目中有這樣一個(gè)配置
<aop:config proxy-target-class="true"/>
這個(gè)配置的作用就是使shiro支持注解 而在springboot項(xiàng)目中shiroconfig類中也有關(guān)于開啟shiro注解支持的配置
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor =new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());
return authorizationAttributeSourceAdvisor;
}
光有上面一段代碼還是不行
@Bean
@ConditionalOnMissingBean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator app=new DefaultAdvisorAutoProxyCreator();
app.setProxyTargetClass(true);
return app;
}
在ShiroConfig類中加上這段代碼是可以完美解決Shiro注解無效的問題 這段代碼中可以看到和在配置文件中相同的配置app.setProxyTargetClass(true)