百度看了一下shiro权限的执行顺序,我的理解是
用户登录账号后 查出当前用户的权限节点(),然后存进shiro的simpleAuthorizationInfo,然后跟接口上的@RequiresPermissions注解值对应上的,就进行权限展示?
现在我在角色表新增一个字段,DataScope(数据范围),在原有的权限上加上数据范围的判断,感觉是没问题,但是还没有思路
shiro一般是功能上的权限控制。数据范围可能需要自己设计,主要体现在sql语句的where条件上。
这个不好实现,网上找找也没有案例或者请教下身边的同事大牛比较靠谱
看了下相关实例,大多是利用SpringBoot整合Shiro配置后台管理项目权限,普遍的方式是通过添加shiro标签在html文件里面,然后判断当前用户是否拥有当前权限,来确认是否展示当前菜单。你可参考下这个实例看看【springboot整合shiro实现权限控制】,链接:https://blog.csdn.net/jiankang66/article/details/90473517/
在调用doGetAuthorizationInfo方法的时候,Shiro会将用户的身份信息传递进来,可以使用PrincipalCollection的getPrimaryPrincipal方法获取到用户的信息。然后可以根据用户的信息去查询该用户具有哪些权限或者角色,然后将这些权限或者角色信息存储到SimpleAuthorizationInfo中。在代码中,已经将用户的权限节点信息存储到了simpleAuthorizationInfo中,如果想加入数据范围的判断,可以再根据用户信息查询出用户的数据范围,然后将数据范围信息也存储到simpleAuthorizationInfo中。
具体的实现方法可以参考下面的代码示例:
@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection)
{
User user = (User)principalCollection.getPrimaryPrincipal();
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
// 获取用户的角色和权限信息
List<Role> roleList = roleMapper.getRolesByUserId(user.getId());
List<Permission> permissionList = permissionMapper.getPermissionsByUserId(user.getId());
for (Role role : roleList)
{
simpleAuthorizationInfo.addRole(role.getName());
}
for (Permission permission : permissionList)
{
simpleAuthorizationInfo.addStringPermission(permission.getPermissionCode());
}
// 获取用户的数据范围信息
DataScope dataScope = dataScopeMapper.getDataScopeByUserId(user.getId());
simpleAuthorizationInfo.addObjectPermission(dataScope);
return simpleAuthorizationInfo;
}
在自定义的Realm的认证方法中,可以使用Subject的checkPermission方法进行数据范围的判断:
@Override protected boolean isPermitted(Permission permission, AuthorizationInfo info)
{
if (permission.getClass().isAssignableFrom(DataScope.class))
{
DataScope dataScope = (DataScope)permission;
// 获取当前用户的数据范围信息
DataScope currentDataScope = (DataScope)info.getObjectPermission();
// 判断数据范围是否匹配
return dataScope.getScope().equals(currentDataScope.getScope());
}
return super.isPermitted(permission, info);
}
这样就可以在调用Controller方法之前同时进行权限和数据范围的判断了。
仅供参考,望采纳,谢谢。
可以结合表设计及业务逻辑实现,
菜单模块:A、B、C,如果需要颗粒度很小可以A/a1/a2等,
角色表关联菜单模型
实现:
当登录是根据用户获取角色及关联的菜单模型,并且每个菜单模型的接口都设计成规则地址,例如:xxxx/api/menu/A/xxxx、xxxx/api/menu/A/a1/xxx
可以根据地址拦截访问的接口是否符合权限
数据权限 你可以新建一张表 在这个表里面记录某个用户的数据范围 ,查询时候关联下这个表查询
我来回答一下这个问题,当前我也遇到了这个需求,分功能权限和数据权限,shiro实现的是功能权限控制,而对数据层面的控制你可以多设计长张表,存放用户数据权限关系,在进行数据查询的时候筛选当前用户是否匹配就行,也就是sql上多添加个where条件即可。