Хотя я недавно стал конвертером в dplyr
для большинства этих типов операций, пакет sqldf
по-прежнему очень хорош (и IMHO более читабельным) для некоторых вещей.
Вот пример того, как можно ответить на этот вопрос с помощью sqldf
x <- data.frame(Category=factor(c("First", "First", "First", "Second",
"Third", "Third", "Second")),
Frequency=c(10,15,5,2,14,20,3))
sqldf("select
Category
,sum(Frequency) as Frequency
from x
group by
Category")
## Category Frequency
## 1 First 30
## 2 Second 5
## 3 Third 34
Можно использовать User.InRole( "RoleName" )
в контроллере.
РЕДАКТИРОВАНИЕ: код ниже не будет работать, так как GetCustomAttributes (), по-видимому, возвращает копию каждого атрибута вместо ссылки на фактический атрибут. Оставленный как ответ обеспечить контекст для других ответов.
До установки его в авторизовать атрибуте, единственная идея, что я имею, состоит в том, чтобы установить его на пустую строку в определении атрибута, затем использовать отражение о типе контроллера, чтобы получить и изменить свойство CustomAttribute, соответствующее AuthorizeAttribute (т.е. тот, типом которого является AuthorizeAttribute) для каждого метода, о котором Вы заботитесь. Необходимо смочь установить свойство Roles на элемент конфигурации тот путь.
var attributes = typeof(MyController).GetMethod("Index")
.GetCustomAttributes(typeof(AuthorizeAttribute),
false)
as AuthorizeAttribute;
attributes[0].Roles = Config.GMPUser;
я предполагаю, что Вы сделали бы, это в Вашем файле Global.asax на приложении запускается так, чтобы это только было сделано однажды.
Атрибуты записываются во время компиляции, поэтому, как обозначено, можно только использовать их с константами. Вы также не можете изменить атрибуты, с тех пор даже если это, кажется, позволяет Вам, это не "придерживается" в следующий раз, когда Вы достаете значение назад. tvanfosson's User.InRole( "RoleName" )
является, вероятно, наилучшим вариантом (у него есть мои +1).
Только для иллюстрирования проблемы с обновлением атрибутов:
class FooAttribute : Attribute
{
public string Bar { get; set; }
}
static class Program
{
[Foo(Bar="abc")]
public static void Main()
{
MethodInfo method = typeof(Program).GetMethod("Main");
var attrib = (FooAttribute) Attribute.GetCustomAttribute(method, typeof(FooAttribute));
Console.WriteLine("Original: " + attrib.Bar);
attrib.Bar = "def";
Console.WriteLine("Updated: " + attrib.Bar);
attrib = (FooAttribute)Attribute.GetCustomAttribute(method, typeof(FooAttribute));
Console.WriteLine("Look again: " + attrib.Bar);
}
}
Печать:
Original: abc
Updated: def
Look again: abc
У меня есть класс под названием StringResources, который обеспечивает доступ к статическим строковым значениям. Я столкнулся с тем же препятствием и решил проблему следующим образом. Я наследовался классу AuthorizeAttribute и добавил переопределение метода для метода AuthorizeCore. Функциональность метода имела вызов к IsInRole () и передачи в статическом свойстве строки. Это добилось цели. Единственная проблема должна создать отдельные классы для каждой роли (или для комбинаций ролей в любом способе Ваша бизнес-логика диктует).
public class SystemAdministratorAuthorizationRequiredAttribute
: AuthorizeAttribute
{
protected override bool AuthorizeCore(System.Security.Principal.IPrincipal user)
{
return
user.IsInRole(
StringResources.AdministrationViewsStrings.SystemAdministratorRoleName
);
}
}
Создайте пользовательский атрибут подобно этому (слегка измененная версия, предоставленная блогом Дэвида Хейдена):
public class MyCustomAuthorizeAttribute : AuthorizeAttribute
{
public IAuthorizationService _authorizationService = new MyAuthorizationService();
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return _authorizationService.Authorize(httpContext);
}
}
и применяйте его подобно этому:
[MyCustomAuthorize]
public ActionResult Create()
{
return View();
}
теперь вы можете поместить всю вашу пользовательскую логику авторизации в свой собственный класс MyAuthorizationService. Замечание: в решении davids вы можете установить внутренний MyAuthorizationService с помощью предоставленного аксессуара. Не уверен, что вы сможете передать ему новую функцию MyAuthorizationService(). Не пробовал.