VoK 整合式登入 - day10

登入功能不外乎输入帐密、验证、赋予角色功能权限。Vaadin-on-Kotlin 提供了 VoK-Security API 用以达成上述功能,本文将使用VoK整合式登入画面。

登入

  1. 开新档案 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()

  1. 登入画面, 开启新档 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。

  1. 在开启页面前检查登入状态,请打开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,在进入该页面前,皆会执行检查登入状态。

执行结果

https://ithelp.ithome.com.tw/upload/images/20210926/20138680BO2pTHaliL.png

自订文字

登入提示文字可修改为中文或任意文字

            val loginI18n: LoginI18n = loginI18n {
                header.title = "您好!"
                with(form){
                    title = "登入"
                    username = "帐号"
                    password = "密码"
                    submit = "登入"
                    forgotPassword = "忘记密码"
                }
                additionalInformation = "请登入"

            }

改为中文後,执行结果如下
https://ithelp.ithome.com.tw/upload/images/20210926/20138680qFPCI44XxS.png

登入可以做得很复杂,也可以很简单,VoK的整合登入画面仅提供帐号密码输入。

本日程序已上传 GitHub


<<:  Day_13 : 让 Vite 来开启你的Vue 之 Option API 与 Mixins

>>:  DAY25 - [React hook] props

【Day03】Git 版本控制 - 什麽是 Git

有些工程师的至理名言是:「人生不能重来,但是 Git 可以。」 所以,什麽是 Git? 维基百科说:...

[拯救上班族的 Chrome 扩充套件] 来说说文章走向和目标

嗨各位,我是 Robin 这次参赛主要是为了宣示要解决各位上班族最大的痛点, 就是... 时常会忙到...

Day 4 : 案例分享(1.2) B2C经典流程 电子商务 + 进销存 + 会计(应收付)

二.电子商务->金流->後台对帐->销单出货 进入商城,加入购物车,并结帐 采客制...

YC SUS Group Session

Group Session 是 YC Startup School 其中一项活动,只要每周都有着实填...

【D2】工具介绍

前言 在真正开始前,不免俗的需要介绍一下工作环境,让大家可以顺利地前进。因此在这边会稍微介绍一下使用...