如何拦截删除并建议用户不可能?

时间:2014-06-26 15:56:12

标签: breeze

我开始使用Breeze.js和ASP MVC + WebApi控制器进行开发。我担心证券,因为我们都应该关注黑客发挥作用的可能性。现在我确实找到了BeforeSaveEntity拦截,它似乎正是我想要在服务器端使用的。我设法在服务器端获得了我想要的安全性,但是如何在客户端处理它,在我使用AngularJS的情况下,我应该如何捕获输出并处理它?让我向您展示我在服务器端使用的一些代码示例:

public class ConferenceContextProvider : EFContextProvider<ConferenceContext>
{
    public ConferenceContextProvider() : base() { }

    // Creating the BeforeSaveEntity for Security purposes, see more details at http://www.breezejs.com/documentation/efcontextprovider#SaveInterception
    protected override bool BeforeSaveEntity(EntityInfo entityInfo)
    {
        // return false if we don’t want the entity saved.if (entityInfo.Entity.GetType() == typeof(Role)
          && entityInfo.EntityState == EntityState.Deleted)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap)
    {
        // return a map of those entities we want saved.
        return saveMap;
    }
}

然后在客户端使用AngularJS

// AngularJS DataService
function saveChanges() {
    if (manager.hasChanges()) {
        var promise =
            manager.saveChanges()
                   .catch(queryFailed)
                   .finally(function (data) {
                       toastr.success('Save to DB Succeeded');
                   });
    } else {
        toastr.warning("Nothing to save");
    };
}

如何捕获结果并处理它?使用Firebug,我可以看到POST返回一个JSON对象,其中Entities数组被填充(如果用户有访问权限)或者相同的数组为空(如果用户有访问被拒绝)。但是如果发生多个变化,那么阵列可能会被应用的部分填充。那么拒绝访问的客户端最好的方法是什么?有人可以给我一个关于如何处理拒绝访问的正确示例代码吗?谢谢你的帮助

1 个答案:

答案 0 :(得分:3)

覆盖BeforeSaveEntity方法意味着在服务器上,一旦收到服务器的有效负载,将在保存实体之前为每个实体调用一次BeforeSaveEntity方法。正如文档所示,如果您返回false,则根本不会保存实体。请注意以下行 -

  

如果方法返回false,则实体将从中排除   保存。如果方法抛出异常,则中止整个保存   并将异常返回给客户端。

如果你抛出一个HTTP错误我它应该正确传播你应该能够捕获该错误客户端并显示它。这假设如果有效负载包含要删除的实体,则要取消整个保存。

示例 -

protected override bool BeforeSaveEntity(EntityInfo entityInfo)
{
    // throw http exception if there is an entity flagged for deletion
    if (entityInfo.Entity.GetType() == typeof(Role)&& entityInfo.EntityState == EntityState.Deleted)
    {
        var response = new HttpResponseMessage(HttpStatusCode.BadRequest){ Content = new StringContent("Cannot delete an entity") };

        throw new HttpResponseException(response);
    }
    else
    {
        return true;
    }
}

在您的客户端查询中,您有一个queryFailed方法(伪代码,检查为正确构造此错误而引发的错误) -

function queryFailed (error) {
    alert('Query failed - ' + error.message);
}

如果你想保存所有其他实体但是这个,然后在响应中返回自定义错误你也可以这样做但是这将需要额外的自定义,这可能是一个更详细的答案