能否在shiro的权限中加上数据范围权限控制呢

百度看了一下shiro权限的执行顺序,我的理解是
用户登录账号后 查出当前用户的权限节点(),然后存进shiro的simpleAuthorizationInfo,然后跟接口上的@RequiresPermissions注解值对应上的,就进行权限展示?

现在我在角色表新增一个字段,DataScope(数据范围),在原有的权限上加上数据范围的判断,感觉是没问题,但是还没有思路

img

shiro一般是功能上的权限控制。数据范围可能需要自己设计,主要体现在sql语句的where条件上。

这个不好实现,网上找找也没有案例或者请教下身边的同事大牛比较靠谱

看了下相关实例,大多是利用SpringBoot整合Shiro配置后台管理项目权限,普遍的方式是通过添加shiro标签在html文件里面,然后判断当前用户是否拥有当前权限,来确认是否展示当前菜单。你可参考下这个实例看看【springboot整合shiro实现权限控制】,链接:https://blog.csdn.net/jiankang66/article/details/90473517/

在调用doGetAuthorizationInfo方法的时候,Shiro会将用户的身份信息传递进来,可以使用PrincipalCollection的getPrimaryPrincipal方法获取到用户的信息。然后可以根据用户的信息去查询该用户具有哪些权限或者角色,然后将这些权限或者角色信息存储到SimpleAuthorizationInfo中。在代码中,已经将用户的权限节点信息存储到了simpleAuthorizationInfo中,如果想加入数据范围的判断,可以再根据用户信息查询出用户的数据范围,然后将数据范围信息也存储到simpleAuthorizationInfo中。

在Controller的方法上使用@RequiresPermissions注解时,Shiro会在调用这个方法之前先进行权限检查。Shiro会检查当前用户是否具有@RequiresPermissions注解中指定的权限,如果没有就抛出UnauthorizedException异常,否就就允许调用这个方法。所以如果想要在权限检查时同时进行数据范围的判断,可以在doGetAuthorizationInfo方法中将数据范围信息也存储到simpleAuthorizationInfo中,然后在自定义的Realm的认证方法中进行数据范围的判断。

具体的实现方法可以参考下面的代码示例:

@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条件即可。