【问题标题】:Protecting multiple, parameterized pages保护多个参数化页面
【发布时间】:2012-05-31 23:55:18
【问题描述】:

示例站点项目模板展示了如何保护单个非参数化页面。我用谷歌搜索了一下,仔细阅读了 WebSharper 的网站等,但不知道如何保护多个参数化页面。有人可以告诉我或指出如何执行此操作的示例吗?

【问题讨论】:

  • 我找到了一个example,如果它有帮助的话,仍然是一个基本的
  • Adam Granicz 提供了a nice example on FPish。这些页面没有参数化,但我假设您可以使用Infer 构建一个站点并将其传递给Protect。我稍后会尝试,如果它有效,我会发布它作为答案。

标签: f# websharper


【解决方案1】:

这个问题最近再次出现在FPish 上。似乎有一个不需要大量重构的简单解决方案。但它需要一个辅助功能:

module Sitelet =

  let Filter (ok: 'T -> bool) (sitelet: Sitelet<'T>) =
    let route req =
        match sitelet.Router.Route(req) with
        | Some x when ok x -> Some x
        | _ -> None
    let link action =
        if ok action then
            sitelet.Router.Link(action)
        else None
    { sitelet with Router = Router.New route link }

假设您有一个包含多个案例的 Action 类型,其中一些是您想要保护的,而一些是公开的:

type Action =
    | Pub ..
    | Priv ..

过滤允许您在完整类型上使用方便的Infer 组合子,然后安全地将受保护部分和公共部分相加。由于总和的站点是从左到右尝试的,因此保护仅适用于需要的地方:

let s1 =
    Sitelet.Infer ..
    |> Sitelet.Protect
    |> Sitelet.Filter (function Priv _ -> true | _ -> false)
let s2 = Sitelet.Infer ..
Sitelet.Sum [s1; s2]

如果不进行过滤,受保护的站点将捕获所有请求。可能还有其他解决方案,包括重构您的 Action 类型并将其拆分为多个子类型,或者在不使用 Infer 的情况下手动编写站点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 2012-11-06
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多