ralasafe查询级数据权限过程 代码剖析
?
我们可以看到很大一部分是和操作数据有关的CRUD,其中不乏getParent(得到父节点,ralasafe的权限是通过树的形式管理,因此必须有很清晰的父子编号)。就不多说了?一看结构都会明白的。回到hasPrivilege方法,pvgMng.getPrivilege(id)?他是怎么来取id对应的记录?ralasafe是把所有的业务权限和非角色权限分开分别放到了一个以id为key的map里,然后根据id去集合里看看有没有该id对应对应的权限,(我估计这里应该是有对集合做了缓存了吧?)。如果不存在就会抛出不存在该权限的异常。回到hasPrivilege方法,接着往下走?我们又看到了一个新的类ApplicationManager,因为我们的应用中配置了2个数据库,一个是ralasafe的(ralasafe-db.properties)和我们自己业务数据库(对应app-ds.properties)?通过applicationManager.getApplication(appName)可以得到对应的是哪个应用,但是我翻看了数据库中的application中只有一条记录?就是ralasafe。Ralasafe实现了缓存,他会到缓存中去拿appName对应的application记录,因为这种记录数据改变的几率是很小的,一般定义完后就不会去碰他了,因此命中率基本上是百分百吧,因此用缓存还是比较合适的,返回的是一个Application类型,里面有3个属性name description?和集合类型的userTypes。分表表示当前的应用的名字?描述?和在最开始安装ralasafe对应的用户元信息.把appName和userTypeName传给getUserRoleManager()方法,得到userRoleManager的实现类,又是一个manager,我们先回忆一下之前说的几个manager类:EntitleManager(相当于dao?封装了操作数据库的方法) ApplicationManager(管理当前的应用和用户元数据信息)??PrivilegeManager(封装了一些列操作权限的方法)?现在的UserRoleManager(是用于管理用户角色的,方法和前面几个类基本相似)。还是回到hasPrivilege方法,我们回忆一下到这一步之前我们完成的工作:根据权限ID得到了权限类,得到了角色管理类(是通过先获取applicationManager,再通过该类获取Application,得到UserType,最后根据appName和UserType得到角色管理类),有些人说获取一个实现类要传参数,这里还是会涉及到缓存,大家知道最简单缓存就是基于map实现的,那么必然需要有一个KEY值,而这个KEY值?就是入参。OK,继续往下走,调到了userRoleManager.hasPrivilege(userid,pvlgId),如下图,该方法会判断当前权限的类型是否是非角色权限?如果是就直接返回,因为没必要判断了,否则继续往下,根据用户,会到ralasafe_ralasafe_userrole表里查找该用户对应的角色有哪些,注意是一个集合,因为一个用户可以拥有多个角色,遍历该集合,对于每一个角色?都会调用RoleManager类里重载的hasPrivilege(roleId,pvlgId)方法:该方法是这样做的,根据角色id到ralasafe_roleprivilege表里查找该角色对应的所有权限,然后和pvlgId比较?如果有相等的?就吧hasPrivilege设为true,说明该角色有该权限。OK?判断权限到此为止。可能看文字比较乱?下次我将画一个流程图?这样会更清晰。还记得最开始我们调用的query方法吗,现在只是判断用户对应的角色是否具有权限,后面的数据级策略判断的代码分析?将在过几天后揭晓。
?