次のコードがあるとします。
public class BackupsController : ApiController
{
private readonly IApiContext context;
private readonly IBackupService backupService;
public BackupsController(IApiContext context, IBackupService backupService)
{
this.context = context;
this.backupService = backupService;
}
public HttpResponseMessage Get(Guid id)
{
if (id == Guid.Empty)
{
throw new HttpResponseException(HttpStatusCode.BadRequest);
}
IBackupView backup = backupService.Get(id);
if (backup == null)
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, String.Format("BackupId '{0}' not found.", id));
}
if (!IsAuthorizedForBackup(backup))
{
throw new HttpResponseException(HttpStatusCode.Forbidden);
}
return Request.CreateResponse(HttpStatusCode.OK, backup);
}
private bool IsAuthorizedForBackup(IBackupView backup)
{
if (context.Principal.IsInRole(MembershipRole.Admin))
{
return true;
}
if (context.Principal.AllowDataSharing && backup.UserId == context.Principal.UserId)
{
return true;
}
if (backup.UserId == context.Principal.UserId && backup.Device.Uuid == context.DeviceUuid)
{
return true;
}
return false;
}
}
メソッド本体のほとんどすべてを認可フィルターに抽出することは理にかなっていますか? バックアップを 2 回取得せずにそれを行う方法がわかりません。
コントローラーのアクションから承認の問題をどのように分離しますか?