我這個看到的問題是, 這將是應用廣泛,
然後,你需要處理它普遍的服務。令人驚訝的是,我將其稱爲IAuthorisationService。
和我 正在尋找有關如何處理此問題的最佳實踐。我應該在CustomControllers看 ?過濾器?或者 是什麼?
無論您選擇哪種方式,都應該使用上面的常見IAuthorisationService。
從我的經驗,我可以告訴大家,它更容易注入服務到控制器,並使用它的每一個動作:
/* Interfaces */
public interface IAuthorisationService {
bool CanEdit(YourItem item);
}
public interface ICurrentUserProvider {
YourUserEntity GetCurrentUser();
}
/* Implementations */
public class HttpUserProvider : ICurrentUserProvider {
public YourUserEntity GetCurrentUser() {
return HttpContext.Current.User.Principal as YourUserEntity;
}
}
public calss RolesAuthorisationService : IAuthorisationService {
ICurrentUserProvider userProvider
public RolesAuthorisationService(ICurrentUserProvider userProvider) {
this.userProvider = userProvider;
}
public bool CanEdit(YourItem item) {
var u = userProvider.GetCurrentUser();
if (u == null)
return false;
return item.Owner == u && u.IsInRole("EditYourItem");
}
}
/* Controller */
public class MyController: Controller {
IAuthorisationService authorisation;
public MyController(IAuthorisationService authorisation) {
this.authorisation = authorisation;
}
public ActionResult Edit(int id) {
var item = GetTheItembyIdSomehow();
if (!authorisation.CanEdit(item))
return new HttpUnauthorizedResult();
// Can do this
}
}
然後你可以使用的ControllerFactory自動注入所需的依賴到控制器:
class DependencyInjectionContainer : WindsorContainer {
public DependencyInjectionContainer() {
RegisterDependencies();
}
private void RegisterDependencies() {
// Services
Register(
AllTypes.Of<IDiscoverableService>()
.FromAssembly(typeof(IDiscoverableService).Assembly)
.Configure(c => c.LifeStyle.Transient)
.WithService.FromInterface()
);
// Controllers
Register(
AllTypes.Of<IController>()
.FromAssembly(typeof(DependencyInjectionContainer).Assembly)
.Configure(c => c.LifeStyle.Transient)
);
}
}
class WindsorControllerFactory : DefaultControllerFactory, IDisposable {
private readonly IWindsorContainer container;
public WindsorControllerFactory() {
container = new DependencyInjectionContainer();
}
protected override IController GetControllerInstance(Type controllerType) {
if (controllerType == null)
return base.GetControllerInstance(controllerType);
return (IController) container.Resolve(controllerType);
}
public void Dispose() {
container.Dispose();
}
}
好的建議。 Re:權限表,ContentID是什麼?可以說我有Orders,OrderItems,SalesSlips等......很多實體。 contentId是什麼?我怎麼知道那個ID地圖呢? – zzz 2009-11-26 00:49:27
在這種情況下,您需要另一個屬於TableID的權限表中的字段。有一個包含表名和表ID的表也很好。 – 2009-11-26 01:52:14
或者,您可以移動到用戶有權訪問的實體,該實體包含有問題的記錄。例如,如果銷售人員可以訪問特定的訂單,他還可以訪問該訂單上的所有訂單項。 – 2009-11-26 02:00:44