gpt4 book ai didi

forms - 使用 Lift 在 Scala 中创建登录/注销表单的最佳方法

转载 作者:行者123 更新时间:2023-12-04 20:21:26 25 4
gpt4 key购买 nike

随着越来越多的人对 Scala 感兴趣(比如我自己),而不是一个问题,我想 讨论基于 Lift 的 web 应用程序登录/注销片段的一种实现.

我刚开始学习 Scala 和 Lift,所以它可能是 不是 实现此类功能的最佳方式,但我想与其他初学者分享,并与更有经验的开发人员讨论。
请注意,我也不是 Web 开发方面的专家。任何改进的帮助将不胜感激(尤其是与性能和安全相关的);-)

1) 首先,片段 需要易于插入,例如在默认模板中使用 1 行代码。我已经使用 完成了它。嵌入式 提升功能(注意下划线,因此它不能呈现为页面本身,而只能从呈现的页面调用,简而言之,某种“私有(private)”片段):

<lift:embed what="_logInForm" />

2) 然后,在 _logInForm.html 中,我使用下面的标记和 条件显示处理一切:
<div>
<!-- User is not logged in, show a form to log in using the method loggedOut -->
<lift:LogInForm.loggedOut>
<form class="lift:LogInForm.logIn?form=post">
<label for="textName">Username: </label><input type="text" id="textName" name="name" /> <span class="lift:Msg?id=name;errorClass=error"/><br/>
<label for="textPassword">Password: </label><input type="password" id="textPassword" name="password" /> <span class="lift:Msg?id=password;errorClass=error"/><br/>
<input type="submit" value="Log in" />
</form>
</lift:LogInForm.loggedOut>

<!-- User is logged in, show who she is and a way to log out using the method loggedIn -->
<lift:LogInForm.loggedIn>
<form class="lift:LogInForm.logOut?form=post">
Connected as <span class="lift:LogInForm.getName" />.<br />
<input type="submit" id="btnLogOut" value="Log out" />
</form>
</lift:LogInForm.loggedIn>
</div>

3) ...现在是这个标记背后的 Scala/Lift 逻辑:
object LogInForm {
private object name extends SessionVar("")
private object password extends RequestVar("")
private object referer extends RequestVar(S.referer openOr "/")
var isLoggedIn = false

def loggedIn(html: NodeSeq) =
if (isLoggedIn) html else NodeSeq.Empty

def loggedOut(html: NodeSeq) =
if (!isLoggedIn) html else NodeSeq.Empty

def logIn = {
def processLogIn() {
Validator.isValidName(name) match {
case true => {
Validator.isValidLogin(name, password) match {
case true => { isLoggedIn = true } // Success: logged in
case _ => S.error("password", "Invalid username/password!")
}
}
case _ => S.error("name", "Invalid username format!")
}
}

val r = referer.is
"name=name" #> SHtml.textElem(name) &
"name=password" #> (
SHtml.textElem(password) ++
SHtml.hidden(() => referer.set(r))) &
"type=submit" #> SHtml.onSubmitUnit(processLogIn)
}

def logOut = {
def processLogOut() { isLoggedIn = false }
val r = referer.is
"type=submit" #> SHtml.onSubmitUnit(processLogOut)
}

def getName = "*" #> name.is
}

评论:
  • 两种形式之间的选择由逻辑进行,呈现提供的标记或 NodeSeq.Empty ,基于用户登录或注销的事实。
  • 我用了电梯:消息在适当的字段(名称/密码)旁边显示错误消息。使用 发送消息S.error 在背后的逻辑和适当的ID。
  • 我实际上使用正则表达式和格式检查等在 Validator 助手中执行检查。每次模式匹配返回一个 bool 值是微不足道的。
  • 我使用 推荐人 因此用户可以在同一页面上登录/注销。
  • 用户名保留为 session 变量 并在登录时显示。

  • 4) 您可以在 Boot.scala 中执行以下操作来控制对其他页面的访问:
        def sitemap() = SiteMap(
    Menu("Home") / "index",
    Menu("Protected page") / "protectedPageName" >> If(() => LogInForm.isLoggedIn, ""),
    // etc.

    问题:
  • 无 SSL 保护 (这可能是一个改进,还没有在 Scala/Lift 中查看过这个)。其他人的任何经验可能有用吗?
  • 使用 session 变量 .也许有更好的方法来保持 Scala/Lift 中的状态?
  • 是否已经有专门用于登录/注销的东西我可能错过的电梯?
  • 它不是很长,但可能会更长紧凑型 ? (不过我不想牺牲太多可读性。其他开发人员需要快速理解它)
  • 还有什么建议吗?

  • 干杯,

    马克。

    最佳答案

  • 这显示了如何强制使用 SSL,您通常将其用于登录表单页面菜单:Lift filter to force ssl
  • session 变量通常是保存 session 信息的最佳方式
  • ProtoUser (你可以使用 Lifty ( http://lifty.github.com/ ) 来建立一个项目,例如登录)
  • 关于forms - 使用 Lift 在 Scala 中创建登录/注销表单的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6093208/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com