auto logout

This commit is contained in:
Alireza Ahmadi
2024-02-27 01:03:00 +01:00
parent e91d8038ad
commit 19a6053098
6 changed files with 26 additions and 10 deletions
+1 -1
View File
@@ -69,7 +69,7 @@ func pureJsonMsg(c *gin.Context, success bool, msg string) {
func checkLogin(c *gin.Context) { func checkLogin(c *gin.Context) {
if !IsLogin(c) { if !IsLogin(c) {
if c.GetHeader("X-Requested-With") == "XMLHttpRequest" { if c.GetHeader("X-Requested-With") == "XMLHttpRequest" {
pureJsonMsg(c, false, "Not authorized") pureJsonMsg(c, false, "Invalid login")
} else { } else {
c.Redirect(http.StatusTemporaryRedirect, "/login") c.Redirect(http.StatusTemporaryRedirect, "/login")
} }
+4 -7
View File
@@ -32,7 +32,7 @@
</v-list-item> </v-list-item>
</v-list> </v-list>
<template v-slot:append> <template v-slot:append>
<v-list-item prepend-icon="mdi-logout" :title="$t('menu.logout')" @click="logout"></v-list-item> <v-list-item prepend-icon="mdi-logout" :title="$t('menu.logout')" @click="Logout"></v-list-item>
</template> </template>
</v-navigation-drawer> </v-navigation-drawer>
</template> </template>
@@ -40,7 +40,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue' import { computed } from 'vue'
import router from '@/router' import router from '@/router'
import HttpUtil from '@/plugins/httputil' import { logout } from '@/plugins/httputil'
const props = defineProps(['isMobile','displayDrawer']) const props = defineProps(['isMobile','displayDrawer'])
@@ -58,10 +58,7 @@ const menu = [
{ title: 'pages.settings', icon: 'mdi-cog', path: '/settings' }, { title: 'pages.settings', icon: 'mdi-cog', path: '/settings' },
] ]
const logout = async () => { const Logout = async () => {
const response = await HttpUtil.get('api/logout') logout()
if(response.success){
router.push('/login')
}
} }
</script> </script>
+3
View File
@@ -17,6 +17,7 @@ export default {
network: "Network", network: "Network",
copyToClipboard: "Copy to clipboard", copyToClipboard: "Copy to clipboard",
noData: "No data!", noData: "No data!",
invalidLogin: "Invalid Login!",
online: "Online", online: "Online",
pages: { pages: {
login: "Login", login: "Login",
@@ -69,10 +70,12 @@ export default {
del: "Delete", del: "Delete",
save: "Save", save: "Save",
update: "Update", update: "Update",
submit: "Submit",
close: "Close", close: "Close",
restartApp: "Restart App", restartApp: "Restart App",
}, },
login: { login: {
title: "Login",
username: "Username", username: "Username",
unRules: "Username can not be empty", unRules: "Username can not be empty",
password: "Password", password: "Password",
+3
View File
@@ -17,6 +17,7 @@ export default {
network: "شبکه", network: "شبکه",
copyToClipboard: "کپی در حافظه", copyToClipboard: "کپی در حافظه",
noData: "بدون داده!", noData: "بدون داده!",
invalidLogin: "ورود نامعتبر!",
online: "آنلاین", online: "آنلاین",
pages: { pages: {
login: "ورود", login: "ورود",
@@ -69,10 +70,12 @@ export default {
del: "حذف", del: "حذف",
save: "ذخیره", save: "ذخیره",
update: "بروزرسانی", update: "بروزرسانی",
submit: "ارسال",
close: "بستن", close: "بستن",
restartApp: "ریستارت پنل", restartApp: "ریستارت پنل",
}, },
login: { login: {
title: "ورود",
username: "نام کاربری", username: "نام کاربری",
unRules: "نام کاربری نمی‌تواند خالی باشد", unRules: "نام کاربری نمی‌تواند خالی باشد",
password: "کلمه عبور", password: "کلمه عبور",
+13
View File
@@ -1,5 +1,6 @@
import api from './api' import api from './api'
import { i18n } from '@/locales' import { i18n } from '@/locales'
import router from '@/router'
import Message from "@/store/modules/message" import Message from "@/store/modules/message"
export interface Msg { export interface Msg {
@@ -14,11 +15,23 @@ function _handleMsg(msg: any): void {
return return
} }
if(msg.msg){ if(msg.msg){
if (!msg.success && msg.msg == "Invalid login") {
sb.showMessage(i18n.global.t('invalidLogin'),'error', 5000)
logout()
return
}
const message = msg.success ? i18n.global.t('success') + ": " + i18n.global.t('actions.' + msg.msg) : i18n.global.t('failed') + ": " + msg.msg const message = msg.success ? i18n.global.t('success') + ": " + i18n.global.t('actions.' + msg.msg) : i18n.global.t('failed') + ": " + msg.msg
sb.showMessage(message, msg.success ? 'success' : 'error', 5000) sb.showMessage(message, msg.success ? 'success' : 'error', 5000)
} }
} }
export const logout = async () => {
const response = await HttpUtils.get('api/logout')
if(response.success){
router.push('/login')
}
}
function _respToMsg(resp: any): Msg { function _respToMsg(resp: any): Msg {
const data = resp.data const data = resp.data
if (data == null) { if (data == null) {
+2 -2
View File
@@ -3,12 +3,12 @@
<v-row justify="center" align="center"> <v-row justify="center" align="center">
<v-col cols="12" sm="8" md="4"> <v-col cols="12" sm="8" md="4">
<v-card> <v-card>
<v-card-title class="headline">Login</v-card-title> <v-card-title class="headline" v-text="$t('login.title')"></v-card-title>
<v-card-text> <v-card-text>
<v-form @submit.prevent="login" ref="form"> <v-form @submit.prevent="login" ref="form">
<v-text-field v-model="username" :label="$t('login.username')" :rules="usernameRules" required></v-text-field> <v-text-field v-model="username" :label="$t('login.username')" :rules="usernameRules" required></v-text-field>
<v-text-field v-model="password" :label="$t('login.password')" :rules="passwordRules" type="password" required></v-text-field> <v-text-field v-model="password" :label="$t('login.password')" :rules="passwordRules" type="password" required></v-text-field>
<v-btn :loading="loading" type="submit" color="primary" block class="mt-2">Login</v-btn> <v-btn :loading="loading" type="submit" color="primary" block class="mt-2" v-text="$t('actions.submit')"></v-btn>
</v-form> </v-form>
<v-select <v-select
density="compact" density="compact"