Вы можете добавить несколько условий к IQueryable
динамически.Таким образом, вы можете сделать что-то вроде:
[PrincipalPermission(SecurityAction.Demand, Role="DepartmentManager")]
public IEnumerable<Employee> GetManagedEmployees()
{
// build base query
var query = from e in context.Employees
select e;
// add condition
query = AddDepartmentPermissions(query);
return query.AsEnumerable();
}
И ваш AddDepartmentPermissions
будет выглядеть так:
private IQueryable<Employee> AddDepartmentPermission(IQueryable<Employee> query)
{
int departmentId = GetAllowedDepartmentSomewhere();
return query.Where(e => e.Department.Id == departmentId);
}
Это всего лишь пример, когда PrincipalPermission
не разрешает звонить GetManagedEmployees
для ролей, не являющихся руководителями, и AddDepartmentPermission
добавляет часть запроса только для выбранных сотрудников из разрешенного отдела.
Суть в том, что вы можете включить IQueryable<T>
в методы, которые будут изменять запрос.Я считаю, что должно быть даже возможно добавить Interception (аспекты) непосредственно к свойствам, выставляющим ObjectSet
, и динамически добавлять части запросов, связанные с безопасностью.