如何知道用户是否拥有树的父节点的权限?

时间:2012-10-22 22:25:50

标签: c# linq tsql recursion

我有一个像公司代表的树,它存储在数据库中,如下表所示:

  ID       ParentID     Name
 ==================================
   1        NULL        Company
   2        1           Division one
   3        1           Division two
   4        1           Division three
   5        2           Department 1.1
   6        3           Department 2.1
   7        3           Department 2.2
   8        3           Department 2.3
   9        4           Department 3.1
  10        NULL        Company 2

现在,当我向用户授予权限时,我需要将他分配给上表中的一个组,如果我将他分配给一个组,他将自动拥有子组的权限。如果它是关于一个组,我可以很容易地检查这个。但是,例如,如果我授予用户权限(分区2),然后用户正在进行某些事务(部门2.2),我需要找到一种自动允许转换的方法,因为用户已被允许在父组上。我只能想到递归方法,其中我检查目标组,如果用户没有权限并且它有一个父组,那么我回想一下相同的方法来验证它的父级,依此类推,直到我找到一个允许用户的组用于或到达根组,而不是对用户进行身份验证。请记住,孩子可以在其中有另一个孩子,等等。

有没有办法以更好的方式做到这一点?使用Linq还是普通的旧T-SQL?

3 个答案:

答案 0 :(得分:1)

AFAIK递归功能是唯一可行的方法。前段时间我问了类似的问题,并且意识到EF和LINQ都无法为你计算。

我的问题:Take all items in sub-categories using LINQ

答案 1 :(得分:1)

我知道您要检查父母的所有孩子。

with tmp as (
  select id, parentId, name, 0 as iteration
  from t
  where id = 3 -- you wanted parent
  union all
  select parent.id, parent.parentId, parent.name, child.iteration + 1
  from tmp child
  join t parent on child.id = parent.parentId
)
select id, parentId, name from tmp
order by iteration

演示: http://sqlfiddle.com/#!3/b5d1d/10

答案 2 :(得分:0)

这样可行:

public class Permission
{
  public ID { get; set; }
  public ParentID { get; set; }
  public Name { get; set; }
}

int userPermissionID = 3;  // Division two
int objectPermissionID = 7; // Department 2.2
bool hasAccess = false;

List<int> check = new List<int>();
check.add(objectPermissionID);

hasAccess = userPermissionID == objectPermissionID;

while(!hasAccess && check.count > 0)
{
  var permissions = context.Permissions
    .Where(p => check.Contains(p.ID))
    .ToList();

  hasAccess = permissions.Any(p => p.ParentID = userPermissionID)

  check = permissions.Select(p => p.ParentID).ToList();
}

if (hasAccess)
{
  ..

您最多可以访问数据库X次,其中X是可用的子分支数。