权限管理设计

wyh_k xxxx xxxx  2017-11-10 10:39:06
各位大佬,我现在遇到一个权限的问题,我这边权限是给用户显示按钮,但是按钮的查出来的来的数据没有限制,现在查看项目进度概况,可以查询出其他部门项目的进度信息,客户要求除了高层可以看到所有项目,其余人选只能查看本部门相关项目进度信息,权限管理模块应该如何设计?希望大佬能提供一个思路,或者推荐相关的博客。。。。谢谢
...全文
140 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
引用一个开源项目的数据范围过滤

/**
	 * 数据范围过滤
	 * @param user 当前用户对象,通过“entity.getCurrentUser()”获取
	 * @param officeAlias 机构表别名,多个用“,”逗号隔开。
	 * @param userAlias 用户表别名,多个用“,”逗号隔开,传递空,忽略此参数
	 * @return 标准连接条件对象
	 */
	public static String dataScopeFilter(User user, String officeAlias, String userAlias) {

		StringBuilder sqlString = new StringBuilder();
		
		// 进行权限过滤,多个角色权限范围之间为或者关系。
		List<String> dataScope = Lists.newArrayList();
		
		// 超级管理员,跳过权限过滤
		if (!user.isAdmin()){
			boolean isDataScopeAll = false;
			for (Role r : user.getRoleList()){
				for (String oa : StringUtils.split(officeAlias, ",")){
					if (!dataScope.contains(r.getDataScope()) && StringUtils.isNotBlank(oa)){
						if (Role.DATA_SCOPE_ALL.equals(r.getDataScope())){
							isDataScopeAll = true;
						}
						else if (Role.DATA_SCOPE_COMPANY_AND_CHILD.equals(r.getDataScope())){
							sqlString.append(" OR " + oa + ".id = '" + user.getCompany().getId() + "'");
							sqlString.append(" OR " + oa + ".parent_ids LIKE '" + user.getCompany().getParentIds() + user.getCompany().getId() + ",%'");
						}
						else if (Role.DATA_SCOPE_COMPANY.equals(r.getDataScope())){
							sqlString.append(" OR " + oa + ".id = '" + user.getCompany().getId() + "'");
							// 包括本公司下的部门 (type=1:公司;type=2:部门)
							sqlString.append(" OR (" + oa + ".parent_id = '" + user.getCompany().getId() + "' AND " + oa + ".type = '2')");
						}
						else if (Role.DATA_SCOPE_OFFICE_AND_CHILD.equals(r.getDataScope())){
							sqlString.append(" OR " + oa + ".id = '" + user.getOffice().getId() + "'");
							sqlString.append(" OR " + oa + ".parent_ids LIKE '" + user.getOffice().getParentIds() + user.getOffice().getId() + ",%'");
						}
						else if (Role.DATA_SCOPE_OFFICE.equals(r.getDataScope())){
							sqlString.append(" OR " + oa + ".id = '" + user.getOffice().getId() + "'");
						}
						else if (Role.DATA_SCOPE_CUSTOM.equals(r.getDataScope())){
//							String officeIds =  StringUtils.join(r.getOfficeIdList(), "','");
//							if (StringUtils.isNotEmpty(officeIds)){
//								sqlString.append(" OR " + oa + ".id IN ('" + officeIds + "')");
//							}
							sqlString.append(" OR EXISTS (SELECT 1 FROM sys_role_office WHERE role_id = '" + r.getId() + "'");
							sqlString.append(" AND office_id = " + oa +".id)");
						}
						//else if (Role.DATA_SCOPE_SELF.equals(r.getDataScope())){
						dataScope.add(r.getDataScope());
					}
				}
			}
			// 如果没有全部数据权限,并设置了用户别名,则当前权限为本人;如果未设置别名,当前无权限为已植入权限
			if (!isDataScopeAll){
				if (StringUtils.isNotBlank(userAlias)){
					for (String ua : StringUtils.split(userAlias, ",")){
						sqlString.append(" OR " + ua + ".id = '" + user.getId() + "'");
					}
				}else {
					for (String oa : StringUtils.split(officeAlias, ",")){
						//sqlString.append(" OR " + oa + ".id  = " + user.getOffice().getId());
						sqlString.append(" OR " + oa + ".id IS NULL");
					}
				}
			}else{
				// 如果包含全部权限,则去掉之前添加的所有条件,并跳出循环。
				sqlString = new StringBuilder();
			}
		}
		if (StringUtils.isNotBlank(sqlString.toString())){
			return " AND (" + sqlString.substring(4) + ")";
		}
		return "";
	}
  • 打赏
  • 举报
回复
wyh_k 2017-11-10
引用 4 楼 ylz2007 的回复:
根据角色走不同的sql
能详细说一下吗?
  • 打赏
  • 举报
回复
Sunyiban 2017-11-10
引用 2 楼 wyh_k 的回复:
[quote=引用 1 楼 ostools 的回复:] 角色对应权限(增删查改),人对应角色 可以用shiro框架或spring security
这点已经做到了,现在就是想要权限细化到查询出的数据[/quote] 在你的数据表里关联权限?
  • 打赏
  • 举报
回复
根据角色走不同的sql
  • 打赏
  • 举报
回复
ostools 2017-11-10
引用 2 楼 wyh_k 的回复:
[quote=引用 1 楼 ostools 的回复:] 角色对应权限(增删查改),人对应角色 可以用shiro框架或spring security
这点已经做到了,现在就是想要权限细化到查询出的数据[/quote]角色 对应 项目 对应项目的增删查改
  • 打赏
  • 举报
回复
wyh_k 2017-11-10
引用 1 楼 ostools 的回复:
角色对应权限(增删查改),人对应角色 可以用shiro框架或spring security
这点已经做到了,现在就是想要权限细化到查询出的数据
  • 打赏
  • 举报
回复
ostools 2017-11-10
角色对应权限(增删查改),人对应角色 可以用shiro框架或spring security
  • 打赏
  • 举报
回复
maradona1984 2017-11-10
数据权限控制核心思想就是拼sql 如果你们表都在一个库可以考虑采用楼上的方式 如果表不在一个库(分布式环境),那就只能拼条件,但如果不用子查询,那你的列名得手动传递进来(因为多表查询得支持别名,列名也可能不一致) 数据权限设计,个人觉得不应该与角色挂钩,同一个角色可能存在不同的数据权限维度,楼上的代码貌似是混在一起的 具体就不多说,做出来比较简单,但优雅的实现还是有点难度
  • 打赏
  • 举报
回复
相关推荐
发帖
Java EE
加入

6.7w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2017-11-10 10:39
社区公告
暂无公告