我有一个我想要过滤的数据库上下文,以便登录用户只能看到他们拥有的项目。我只想在数据库上下文中指定此过滤器,因此我不必尝试在多个位置进行维护。最终结果是在我的数据库上下文中添加这样的过滤器:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Foo>().HasQueryFilter(f => f.OwnerId == getCurrentUserIdSomehow())
}
我尝试过的事情:
我的想法是创建一个服务来获取当前登录的用户:
public interface IUserProvider
{
string GetUserId();
}
public class UserIdProvider : IUserProvider
{
private IHttpContextAccessor _accessor;
public UserIdProvider(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
public string GetUserId()
{
var identity = _accessor.HttpContext.User.Identity;
if (identity.IsAuthenticated)
{
return _accessor.HttpContext.User
.FindFirst(ClaimTypes.NameIdentifier).Value.ToString();
}
else
{
return Guid.Empty.ToString();
}
}
}
然后,我可以在ConfigureServices()
中的Startup
方法中注入它:
services.AddTransient<IUserProvider, UserIdProvider>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
然后,一旦我将该服务注入到我的数据库上下文的构造函数中,我的过滤器变为:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Foo>().HasQueryFilter(f => f.OwnerId == _userProvider.GetUserId())
}
这样可行,但有更简单或更简洁的方法吗?在构造数据库上下文时,感觉应该有一种更简单的方法来查找当前用户ID。
我考虑过将UserManager
服务注入我的数据库上下文,但无法找到获取当前用户的方法。