登入功能不外乎输入帐密、验证、赋予角色功能权限。Vaadin-on-Kotlin 提供了 VoK-Security API 用以达成上述功能,本文将使用VoK整合式登入画面。
LoginServlices.kt
package com.example.vok
import com.vaadin.flow.component.UI
import eu.vaadinonkotlin.vaadin10.Session
import java.io.Serializable
class LoginServices: Serializable {
var currentUser: User? = null
private set
val isLoggedIn get() = currentUser != null
fun login(username: String, password: String): Boolean{
// TODO verify username and password
currentUser = User(username)
UI.getCurrent().page.reload()
return true
}
fun logout(){
Session.current.close()
UI.getCurrent().navigate("")
UI.getCurrent().page.reload()
}
}
val Session.loginService: LoginServices
get() = getOrPut { LoginServices() }
data class User(val name: String) : Serializable
currentUser 可供读取,但不提供其他程序赋值。
本范例并未实际检查使用者帐号密码是否正确,当login()被呼叫直接设定该user为登入状态,并更新画面。
logout()被呼叫时,清除Session、导至首页後更新画面。
val Session.loginService: LoginServices
get() = getOrPut { LoginServices() }
亦即当 Session.loginService 被读取时,若已存在就直接取用,若不存在就新增一个 LoginSerivces()
LoginView.kt
package com.example.vok
import com.github.mvysny.karibudsl.v10.*
import com.vaadin.flow.component.login.LoginForm
import com.vaadin.flow.component.login.LoginI18n
import com.vaadin.flow.router.BeforeEnterEvent
import com.vaadin.flow.router.BeforeEnterObserver
import com.vaadin.flow.router.Route
import eu.vaadinonkotlin.vaadin10.Session
@Route("login")
class LoginView: KComposite(), BeforeEnterObserver {
private lateinit var loginForm: LoginForm
private val root = ui{
verticalLayout {
setSizeFull(); isPadding = false; content { center() }
val loginI18n: LoginI18n = loginI18n {
header.title = "您好!"
additionalInformation = "请登入"
}
loginForm = loginForm(loginI18n){
addLoginListener {event ->
isError = !Session.loginService.login(event.username, event.password)
}
}
}
}
override fun beforeEnter(event: BeforeEnterEvent) {
if (Session.loginService.isLoggedIn){
event.rerouteTo("")
}
}
}
LoginForm 是 Vaadin 提供的 UI Component,LoginI18n 则是提供LoginForm需要的资料,使用编码为 UTF8。
MainLayout.kt
@Viewport(Viewport.DEVICE_DIMENSIONS)
class MainLayout: KComposite(), RouterLayout, BeforeEnterObserver {
private val root = ui {
div {
setSizeFull()
}
}
}
override fun beforeEnter(event: BeforeEnterEvent) {
if (event.navigationTarget != LoginView::class.java && !Session.loginService.isLoggedIn) {
event.rerouteTo(LoginView::class.java)
}
}
@Viewport 即 html 的 <meta name=”viewport”>
为了符合不同尺寸装置最佳浏览
在 MainLayout.kt
加上检查,只要上层layout为 MainLayout,在进入该页面前,皆会执行检查登入状态。
登入提示文字可修改为中文或任意文字
val loginI18n: LoginI18n = loginI18n {
header.title = "您好!"
with(form){
title = "登入"
username = "帐号"
password = "密码"
submit = "登入"
forgotPassword = "忘记密码"
}
additionalInformation = "请登入"
}
改为中文後,执行结果如下
登入可以做得很复杂,也可以很简单,VoK的整合登入画面仅提供帐号密码输入。
本日程序已上传 GitHub
<<: Day_13 : 让 Vite 来开启你的Vue 之 Option API 与 Mixins
>>: DAY25 - [React hook] props
有些工程师的至理名言是:「人生不能重来,但是 Git 可以。」 所以,什麽是 Git? 维基百科说:...
嗨各位,我是 Robin 这次参赛主要是为了宣示要解决各位上班族最大的痛点, 就是... 时常会忙到...
二.电子商务->金流->後台对帐->销单出货 进入商城,加入购物车,并结帐 采客制...
Group Session 是 YC Startup School 其中一项活动,只要每周都有着实填...
前言 在真正开始前,不免俗的需要介绍一下工作环境,让大家可以顺利地前进。因此在这边会稍微介绍一下使用...