【问题标题】:Using IsOperationAllowedOnDocument in RavenDB returns InvalidSystemOperation exception在 RavenDB 中使用 IsOperationAllowedOnDocument 返回 InvalidSystemOperation 异常
【发布时间】:2011-11-22 22:18:20
【问题描述】:

我是 RavenDB 的新手,需要文档级别的授权帮助。使用 Advanced.IsOperationAllowedOnDocument 时收到以下异常:

TestRavenDB.TestSuite.CanAssignRoleToUser: System.InvalidOperationException :

不知道该怎么做

您的请求与 Raven 知道的任何事情都不匹配,抱歉...

----> System.Net.WebException : 远程服务器返回错误: (400) Bad Request.

我的代码是:

string operation = "Workflow/ApproveVacation";
string geddyUser = "Authorization/Users/glee";

var workflow = WorkflowMother.SpawnWorkflow();
var docStore = GetDocStore();
TruncateWorkflowDocuments(docStore);

using(var s = docStore.OpenSession())
{
    s.Store(new AuthorizationUser()
        {
            Name = "Geddy Lee",
                    Id = geddyUser,
                    Roles = { "Authorization/Roles/BandLeader" }
    });

        s.Store(workflow);

    s.SetAuthorizationFor(workflow, new DocumentAuthorization
        {
            Permissions = 
                {
                    new DocumentPermission
                        {
                            Allow = true,
                                Operation = operation,
                                Role = "Authorization/Roles/BandLeader"
                        }
                }
    });

    s.SaveChanges();
}

using(var s = docStore.OpenSession())
{       
    var operationResults = s.Advanced.IsOperationAllowedOnDocument(geddyUser, operation, workflow.Id);
        Assert.IsTrue(operationResults.IsAllowed);

}

似乎正在使用“Workflow/ApproveVacation”作为 POST 或 GET 等 http 命令发出 http 请求。我是否误解了 IsOperationAllowedOnDocument 的使用?

编辑

我查看了文档的元数据并添加了权限:

"Permissions": [
      {
        "Operation": "Workflow/ApproveVacation",
        "User": null,
        "Role": "Authorization/Roles/BandLeader",
        "Allow": true,
        "Priority": 0
      }

编辑 2

查看代码我发现了 DocumentSession 类上的 GetAuthorizationFor 方法。它返回一个 DocumentPermission 对象,其中包含文档的权限,其中包括有关操作的信息。我想我可以使用它,但我仍然对 IsOperationAllowedOnDocument 方法的目的感到困惑。

编辑 3

我尝试使用 curl 向我的 Raven 服务器发出不同的请求。使用此行会产生 400 错误:

curl http://bho-vm36:8080/authorization/IsAllowed/Authorization/Users/glee?operation=Workflow/ApproveVaca‌​tion&id=workflows/15361 -v

没有“端点”来处理这个请求。在不单步执行源代码的情况下,我假设这就是代码为我创建的请求。

【问题讨论】:

  • 查看请求的实际内容,它会告诉你发生了什么。
  • @Ayende:获取 /authorization/IsAllowed/Authorization/Users/glee?operation=Workflow/ApproveVacation&id=workflows/15361。我有 AuthorizationUser 和 Workflow 对象的 PUT。我没有看到 SetAuthorizationFor 方法的任何内容。
  • @Ayende:知道了。这叫RTFM!!!我慢慢阅读了授权包文档并注意了安装说明。真的很喜欢 RavenDB 对我和我的团队的发展方向。

标签: authorization ravendb


【解决方案1】:

Ayende 让我沿着正确的方向思考。授权包未安装在服务器上,因此错误消息指出“授权”未知(400 错误请求)。弄乱 curl 并向 Raven 服务器发送 http 请求可以帮助我找到方向。服务器控制台应用程序返回的消息是我开始“手动”创建请求的地方。

解决步骤:

  1. 编辑 Raven.Server.exe.config 并添加密钥

    <add key="Raven/Plugins" value="~\Plugins"/>

  2. 在服务器目录下创建名为 Plugins 的文件夹

  3. 将 Raven.Bundles.Authorization.dll 复制到插件中

关于授权的文档是here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多