我不确定我的问题在哪里。我想创建一个自定义授权属性来检查角色和权限。我们的权限不是您的标准,此角色具有这些权限,但每个角色的更多权限可以拥有一些权限,但不能拥有其他权限。
我已经覆盖了AuthorizeAttribute类中的AuthorizeCore方法:
internal class RoleAttribute : AuthorizeAttribute
{
private readonly IUserRepository _userRepository;
private readonly IPermissionRepository _permissionRepository;
public RoleAttribute(IUserRepository userRepository, IPermissionRepository permissionRepository)
{
_userRepository = userRepository;
_permissionRepository = permissionRepository;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
User user = _userRepository.GetUsers();
Permission permission = _permissionRepository.GetPermissions();
return user.Permissions.Where(x => x.Id == permission.Id).Any();
}
}
这样当我实现属性时:
private static IUserRepository _userRepository;
private static IPermissionRepository _permissionRepository;
public TopNavigationController(IUserRepository userRepository, IPermissionRepository permissionRepository)
{
_userRepository = userRepository;
_permissionRepository = permissionRepository;
}
[Role(_userRepository, _permissionRepository)]
public ActionResult MethodThatHasStuff()
{
//Do stuff return stuff if user has the permissions
}
我无法将依赖注入到重写方法中,因为我无法将注入传递给属性。
我意识到这不是解决问题的好方法,但在我们与客户合作之前,我们需要相应地开发更好的实践。
我的主要问题是:是否有更好的方法来创建允许此类行为的自定义授权过滤器?
答案 0 :(得分:1)
如果您认为仅仅因为您在控制器中实例化了存储库,那么每个请求都将使用相同的实例,那么您就错了。每次都会实例化控制器。因此,您不仅仅是通过在属性中实例化repos来节省自己。鉴于使用属性的局限性,实际上没有更好的方法可以让它访问依赖项,并且在控制器上使用静态是一个非常糟糕的主意。