我试图总结我的周围榆树头。我在哈斯克尔的经验,有点二郎神。
我想完成下面的练习:
localhost/auth
尝试和接受的身份验证令牌。这是很基本的,但希望够复杂的Web应用程序真正的行为进行建模。
我的第一个问题是与Model
。如果客户端进行身份验证,我只需要的数据。我应该以一种类似于Maybe
单子包裹的东西呢?
type Model
= NoAuth String String
| AuthFetching
| AuthFailed err
| AuthSuccess String
然后登录屏幕可以显示微调和错误,或重定向到一个新的一页。
这感觉就像它关系的应用程序状态的其余部分的认证状态。虽然是“正确的”,感觉错把整个模型是只有一个记录一个(变量类型?)。
“感觉”更正确的有模型,如下所示:
type FetchStatus
= Loading
| Success val
| Err err
type Model =
{ token : RequestStatus String
, data : List number
}
但每当你更新模型,现在需要检查是否token
仍然存在 - 在记录中,即模式匹配。在第一个例子,你只需要模式匹配的整体模式,这是一个有点简单。
并责成登录表单状态,我需要添加额外的字段:
type Model =
{ token : RequestStatus String
, data : List number
, username : String
, password : String
}
这感觉不正确,因为password
应该不会在内存中的登录后举行。我在记录持有这些,但我不能在自定义type
申报记录。
总而言之,我有点糊涂了。可有人请一些线索最“正确”的,惯用的方式做到这一点?
所有授权相关的东西应该在后端侧进行处理。榆木的工作只是要显示的内容服务器发送给它的。在我看来,你提出的第一个选项是最好的这样一个小例子,但在更多的实际生活中的应用类型系统会更复杂:
type LoginForm =
{ username : String
, password : String
}
type Activity
= Login LoginForm
| LoginSuccess
| LoginFailure String
type Model =
{ loggedUser : Maybe String
, activity : Activity
, ...
}
你不需要(也不应该)保持密码的前端。你也应该不会在客户端进行任何授权,因为客户端可以很容易地在他的浏览器更换任何脚本。后端将跟踪用户是否被如登录。会话cookie。在即使loggedUser
值设置为Just "someguy"
和“someguy”这种情况下没有被标记为记录在服务器的数据库,需要授权不得违反任何行动。
总之,处理登录,并给予权限访问任何内容对后端的工作。榆树是前端的语言,所以它的唯一目的是在这里显示的东西。