最近笔者在做 CMS系统 的时候, 针对安全框架进行选型, 其实说白了就是对shiro
和security
进行筛选, 百度一圈, 知乎一圈敲定使用shiro作为安全框架, 和很多人一样, 第一次使用shiro 自然师从涛哥, 从shiro讲解上 涛哥无疑
NO.1(这真不是舔, 谁用谁知道)
经过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
中, 欧克可以使用
就当我以为 开启权限只需要注入上面那个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配置, 生命周期配置@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
log.debug("shiro 授权中...............");
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
重点看看这 你是如何授权的,建议授权后,打印你的授权内容,看看注解指定的时候,是不是存在
对于我这个犯错大王 ,shiro见招拆招: 其二也不远了, 啊哈哈哈哈哈哈