Filter 在处理之前更改控制器中的查询字符串

Filter 在处理之前更改控制器中的查询字符串,filter,controller,breeze,Filter,Controller,Breeze,场景:我的应用程序运行查询,其中用户id在许多情况下用于过滤用户可以看到的数据。用户id是一个整数。我不希望用户能够简单地更改查询字符串,并将用户ID parm更改为另一个#(本质上假设另一个用户的身份)。通过我们的身份验证过程,发送给服务器的每个请求都在头中包含一个安全令牌,在客户端登录时返回给客户端。在身份验证过程中,此令牌存储在服务器上,并映射到用户的用户id 我想做的是将令牌从标头中拉出,进行查找并获取映射到令牌值的用户ID(使其正常工作),然后更改查询字符串以添加用户ID 因此,请求可

场景:我的应用程序运行查询,其中用户id在许多情况下用于过滤用户可以看到的数据。用户id是一个整数。我不希望用户能够简单地更改查询字符串,并将用户ID parm更改为另一个#(本质上假设另一个用户的身份)。通过我们的身份验证过程,发送给服务器的每个请求都在头中包含一个安全令牌,在客户端登录时返回给客户端。在身份验证过程中,此令牌存储在服务器上,并映射到用户的用户id

我想做的是将令牌从标头中拉出,进行查找并获取映射到令牌值的用户ID(使其正常工作),然后更改查询字符串以添加用户ID

因此,请求可能会以

http://localhost/api/app/customerlist
在我得到用户id后,它可能会像这样

http://localhost/api/app/customerlist?$filter=userid%20eq%1234
然后继续

这是一个简单的场景,但说明了我的目标。我无法将代理项键添加到数据库并使用GUID或其他值作为筛选列。基本上被结构卡住了


谢谢

请查看EntityQuery.withParameters方法。有了它,您可以从客户端接受任何查询,并将您的用户id筛选器添加到其中。差不多

 myQuery = myQuery.withParameters( { userId: 1234});
 myEntityManager.executeQuery(myQuery).then(...); 

或者我遗漏了什么。

看看EntityQuery.withParameters方法。有了它,您可以从客户端接受任何查询,并将您的用户id筛选器添加到其中。差不多

 myQuery = myQuery.withParameters( { userId: 1234});
 myEntityManager.executeQuery(myQuery).then(...); 

或者我遗漏了什么。

在服务器端,您可以将任何筛选器直接添加到返回的IQueryable中。如果使用Authorize属性,还可以通过“user”变量访问用户数据

[BreezeController]
[Authorize]
public class NorthwindIBModelController : ApiController {

   [HttpGet]
   public IQueryable<Customer> CustomerList() {
     var userName = User.Identity.Name;

     var filter = filter on customers;
     var custs = ContextProvider.Context.Customers.Where({ some filter using userName});
   }

}
[BreezeController]
[授权]
公共类NorthwindIBModelController:ApicController{
[HttpGet]
公共IQueryable客户列表(){
var userName=User.Identity.Name;
var filter=对客户进行筛选;
var custs=ContextProvider.Context.Customers.Where({some filter using userName});
}
}
另请参见:

在服务器端,您可以将任何筛选器直接添加到返回的IQueryable中。如果使用Authorize属性,还可以通过“user”变量访问用户数据

[BreezeController]
[Authorize]
public class NorthwindIBModelController : ApiController {

   [HttpGet]
   public IQueryable<Customer> CustomerList() {
     var userName = User.Identity.Name;

     var filter = filter on customers;
     var custs = ContextProvider.Context.Customers.Where({ some filter using userName});
   }

}
[BreezeController]
[授权]
公共类NorthwindIBModelController:ApicController{
[HttpGet]
公共IQueryable客户列表(){
var userName=User.Identity.Name;
var filter=对客户进行筛选;
var custs=ContextProvider.Context.Customers.Where({some filter using userName});
}
}
另请参见:

看起来您的解决方案是基于客户端的,对吗?我需要更改服务器上的查询字符串。我的大多数用户都不是很专业,但是如果他们中的一个掌握了Fiddler或类似的技术,他们可以看到完整的URL,并将过滤器发送到服务器。他们可能只是尝试改变用户id,看看会发生什么。通过反复试验,他们可能会看到他们看不到的数据。看起来您的解决方案是基于客户端的,对吗?我需要更改服务器上的查询字符串。我的大多数用户都不是很专业,但是如果他们中的一个掌握了Fiddler或类似的技术,他们可以看到完整的URL,并将过滤器发送到服务器。他们可能只是尝试改变用户id,看看会发生什么。通过反复试验,他们可能会看到他们看不到的数据。我想我们正在接近。如果已经有了一个过滤器,这会起作用吗?我从客户那里收到了这个:htt://myapp/api/account?$filter=CustomerState%20eq%20'NY'&$orderby=AccountName。我在CustomerState和orderby上有一个过滤器。根据您的建议,我是否可以添加用户名筛选器,并保留现有的CustomerState筛选器和订购者?是的,它会;Breeze从您在服务器上提供的IQueryable开始,然后向其添加客户端过滤器。我认为我们离此越来越近了。如果已经有了一个过滤器,这会起作用吗?我从客户那里收到了这个:htt://myapp/api/account?$filter=CustomerState%20eq%20'NY'&$orderby=AccountName。我在CustomerState和orderby上有一个过滤器。根据您的建议,我是否可以添加用户名筛选器,并保留现有的CustomerState筛选器和订购者?是的,它会;Breeze从您在服务器上提供的IQueryable开始,然后向其添加客户端过滤器。