前言
- 当引入登录模块后我们需要做菜单。而菜单自然需要权限的参与,我们在springboot中设计的权限细粒度还算是比较细的。当我们查询菜单是需要根据权限查找对应的菜单。但是在springboot中我设计了一个底层超级管理员
- 先来看看我一开始实现这个超级管理员菜单获取的部分代码
if (SecurityUtils.getSubject().hasRole(RoleList.SUPERADMIN)) {listemp = customMapper.selectRootMenusByRoleIdList(null,null, null, null);} else {listemp = customMapper.selectRootMenusByRoleIdList(roleList, oauthClientId,null, moduleCodes);}
- 这样实现是很正常的思路,通过判断角色是否是超级管理员来做分支执行思路,但是超级管理员可能涉及到多个地方如果在每个地方都这样if else执行的,我觉得有点low, 所以我决定改造一下。不够最终执行的思路依然是if else判断 。 只不过让我们在代码层面上功能间不在那么杂糅在一起
自定义注解
- 首先我需要两个注解,
SuperDirection
和SuperDirectionHandler
分别表示需要判断超级管理员分支和具体管理员分支的目标函数 。 这句话说的还是有点抽象的,容我慢慢道来!
SuperDirection
@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface SuperDirection {String value() default StringUtils.EMPTY;}
SuperDirectionHandler
@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface SuperDirectionHandler {}
作用
SuperDirection
是用于表明该方法需要进行判断超级管理员,而value值存储的就是判断的表达式。关于这个表达式我们后面介绍SuperDirectionHandler
我们不难发现他没有实际属性但是多了一个@Component
注解。目的是方便Spring管理该注解;这样我们就可以通过Spring来获取被该注解标注的类了。
位置
- 该注解释放给全局使用的,在maltcloud结构介绍中我们知道org.framework.core模块是所有模块的基石,所以这两个注解我选择在
org.framework.core
模块中
切面
- 我们想在方法执行前进行条件判断,可选方案有很多我们可以在filter中拦截方法进行判断选择执行哪一个,但是过滤器中我们无法直接获取到方法的相关信息,注意这里说的是无法直接获取,如果你想在filter中实现也不是不行,这种方案感兴趣的可以试试
<