实际上是基于hasPermission这个方法进行校验的。
调试可以看到有个校验授权的过程。
首先是判断权限是否为空,为空则说明已经有权限,返回true。
接着尝试获得当前登录的角色。如果为空,说明没有权限。从缓存中获取角色的用户编号。拿到之后还会去过滤一下,拿到只有开启状态的角色。
接着判断是否是超级管理员,如果是,也是return true。
第三段逻辑则会遍历每一个权限,判断这个权限对应的菜单,最终在这个用户上有没有角色去满足。
有的时候不是校验是否有权限,而是判断是否有某个角色,则可以使用hasRole这个方法。
实现核心是基于Spring Security提供的@PreAuthorize注解,这个注解可以添加在方法上,基于表达式判断,是否有权限。
它的实现原理是基于AOP。生效则需要配置注解@EnableGlobalMethodSecurity(prePostEnabled=true)。
权限表达式有两种,一种是基于角色标识的校验,一种是基于权限标识的校验。具体表达式如图所示:
参考资料:2.功能权限 - 06、后端如何实现 URL 权限的校验?