This commit is contained in:
yulixing 2019-07-12 13:30:47 +08:00
parent b474ff0fe2
commit 1c10eb152f
9 changed files with 141 additions and 68 deletions

View File

@ -15,6 +15,7 @@
}, },
"dependencies": { "dependencies": {
"axios": "0.18.1", "axios": "0.18.1",
"cryptorjs": "^3.0.0",
"element-ui": "^2.10.1", "element-ui": "^2.10.1",
"js-cookie": "2.2.0", "js-cookie": "2.2.0",
"moment": "^2.24.0", "moment": "^2.24.0",

View File

@ -30,6 +30,7 @@ export function login(data) {
data, data,
}) })
} }
export function register(data) { export function register(data) {
return request({ return request({
url: '/ldap-user-manage/', url: '/ldap-user-manage/',
@ -37,6 +38,7 @@ export function register(data) {
data, data,
}) })
} }
export function changePwd(data) { export function changePwd(data) {
const id = data.id const id = data.id
delete data.id delete data.id
@ -47,6 +49,14 @@ export function changePwd(data) {
}) })
} }
export function getInfo(params) {
return request({
url: '/ldap-user-manage/',
method: 'get',
params,
})
}
// TODO: del // TODO: del
export function logout() { export function logout() {
return request({ return request({

View File

@ -5,28 +5,74 @@ import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title' import getPageTitle from '@/utils/get-page-title'
import {encoded, decoded} from '@/utils/cryptor'
NProgress.configure({ showSpinner: false }) // NProgress Configuration NProgress.configure({ showSpinner: false }) // NProgress Configuration
const whiteList = ['/login'] // no redirect whitelist const whiteList = ['/login', '/register'] // no redirect whitelist
// router.beforeEach(async (to, from, next) => { router.beforeEach(async(to, from, next) => {
// // start progress bar // start progress bar
// NProgress.start() NProgress.start()
// // set page title // set page title
// document.title = getPageTitle(to.meta.title) document.title = getPageTitle(to.meta.title)
// const accessRoutes = await store.dispatch('permission/generateRoutes', ['admin']) // determine whether the user has logged in
// router.addRoutes(accessRoutes) // const hasToken = getToken()
// next() const token = getToken()
// })
router.afterEach(async() => { if (token) {
// document.title = getPageTitle(to.meta.title) if (to.path === '/login') {
// if is logged in, redirect to the home page
next({ path: '/' })
NProgress.done()
} else {
// determine whether the user has obtained his permission roles through getInfo
const hasRoles = store.getters.roles && store.getters.roles.length > 0
if (hasRoles) {
next()
} else {
try {
// // get user info
// // note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
const userInfo = await store.dispatch('user/getInfo')
const accessRoutes = await store.dispatch('permission/generateRoutes' , ['admin']) const roles = userInfo.roles
// // generate accessible routes map based on roles
const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
// // dynamically add accessible routes
router.addRoutes(accessRoutes) router.addRoutes(accessRoutes)
// // hack method to ensure that addRoutes is complete
// // set the replace: true, so the navigation will not leave a history record
next()
} catch (error) {
// remove token and go to login page to re-login
await store.dispatch('user/resetToken')
Message.error(error || 'Has Error')
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
}
} else {
/* has no token*/
if (whiteList.indexOf(to.path) !== -1) {
// in the free login whitelist, go directly
next()
} else {
// other pages that do not have permission to access are redirected to the login page.
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
})
router.afterEach(() => {
// finish progress bar // finish progress bar
NProgress.done() NProgress.done()
}) })

View File

@ -2,8 +2,9 @@ const getters = {
sidebar: state => state.app.sidebar, sidebar: state => state.app.sidebar,
device: state => state.app.device, device: state => state.app.device,
token: state => state.user.token, token: state => state.user.token,
avatar: state => state.user.avatar, username: state => state.user.username,
name: state => state.user.name, roles: state => state.user.toles,
permission_routes: state => state.permission.routes, permission_routes: state => state.permission.routes,
} }
export default getters export default getters

View File

@ -1,36 +1,40 @@
import {login, logout, getInfo} from '@/api/user' import {login, logout, getInfo} from '@/api/user'
import {getToken, setToken, removeToken} from '@/utils/auth' import {getToken, setToken, removeToken} from '@/utils/auth'
import {encoded, decoded} from '@/utils/cryptor'
import router, {resetRouter} from '@/router' import router, {resetRouter} from '@/router'
const state = { const state = {
token: getToken(), token: getToken(),
name: '', username: '',
avatar: '', roles: [],
} }
const mutations = { const mutations = {
SET_TOKEN: (state, token) => { SET_TOKEN: (state, token) => {
state.token = token state.token = token
}, },
SET_NAME: (state, name) => { SET_USERNAME: (state, username) => {
state.name = name state.username = username
console.log('SET_USERNAME', state.username)
}, },
SET_AVATAR: (state, avatar) => { SET_ROLES: (state, roles) => {
state.avatar = avatar state.roles = roles
console.log('SET_ROLES', state.roles)
}, },
} }
const actions = { const actions = {
// user login // user login
login({commit, dispatch}, userInfo) { login({commit, dispatch}, userInfo) {
const {username, password} = userInfo const {username, password, platform} = userInfo
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
login({username: username.trim(), password: password}) login({username: username.trim(), password: password, platform: platform})
.then(async response => { .then(async response => {
const {data} = response // const {data} = response
const roles = data.roles || ['admin'] const token = encoded(username)
commit('SET_TOKEN', data.token) // console.log('login', response)
setToken(data.token) commit('SET_TOKEN', token)
setToken(token)
resolve() resolve()
}) })
.catch(error => { .catch(error => {
@ -43,20 +47,31 @@ const actions = {
// get user info // get user info
getInfo({commit, state}) { getInfo({commit, state}) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
getInfo(state.token) const username = decoded(state.token)
if (!username) {
resolve({})
}
getInfo({search: username})
.then(response => { .then(response => {
const {data} = response const {data} = response
console.log(data) const userInfo = data[0]
let roles = userInfo.o
if (!data) { if (!userInfo) {
reject('Verification failed, please Login again.') reject('Verification failed, please Login again.')
} }
const {name, avatar} = data if (roles.includes('pop-sys-admin')) roles = ['admin']
commit('SET_NAME', name) commit('SET_USERNAME', userInfo.uid)
commit('SET_AVATAR', avatar) commit('SET_ROLES', roles)
resolve(data)
// TODO:
console.log('userInfo', userInfo)
userInfo.roles = roles
resolve(userInfo)
}) })
.catch(error => { .catch(error => {
reject(error) reject(error)

View File

@ -1,15 +1,13 @@
import Cookies from 'js-cookie' const TokenKey = 'token'
const TokenKey = 'vue_admin_template_token'
export function getToken() { export function getToken() {
return Cookies.get(TokenKey) return sessionStorage.getItem(TokenKey) || ''
} }
export function setToken(token) { export function setToken(token) {
return Cookies.set(TokenKey, token) return sessionStorage.setItem(TokenKey, token)
} }
export function removeToken() { export function removeToken() {
return Cookies.remove(TokenKey) return sessionStorage.removeItem(TokenKey)
} }

14
src/utils/cryptor.js Normal file
View File

@ -0,0 +1,14 @@
import cryptorjs from 'cryptorjs'
const myCryptor = new cryptorjs('yourSecretKey');
export function encoded(str) {
return myCryptor.encode(str);
}
export function decoded(str) {
return myCryptor.decode(str);
}

View File

@ -2,6 +2,7 @@ import axios from 'axios'
import {MessageBox, Message} from 'element-ui' import {MessageBox, Message} from 'element-ui'
import store from '@/store' import store from '@/store'
import {getToken} from '@/utils/auth' import {getToken} from '@/utils/auth'
import {encoded, decoded} from '@/utils/cryptor'
// create an axios instance // create an axios instance
const service = axios.create({ const service = axios.create({
@ -14,13 +15,17 @@ const service = axios.create({
service.interceptors.request.use( service.interceptors.request.use(
config => { config => {
// do something before request is sent // do something before request is sent
const token = store.getters.token
const username = store.getters.username
console.log(token, username, decoded(token))
if (store.getters.token) { // if (decoded(token) !== username) {
// let each request carry token // let each request carry token
// ['X-Token'] is a custom headers key // ['X-Token'] is a custom headers key
// please modify it according to the actual situation // please modify it according to the actual situation
config.headers['X-Token'] = getToken() // config.headers['X-Token'] = getToken()
} // return Promise.reject('permission denied!')
// }
return config return config
}, },
error => { error => {
@ -49,14 +54,12 @@ service.interceptors.response.use(
Message({ Message({
message: data.errmsg || 'error', message: data.errmsg || 'error',
type: 'error', type: 'error',
duration: 5 * 1000 duration: 5 * 1000,
}) })
return Promise.reject(data.errmsg || 'error') return Promise.reject(data.errmsg || 'error')
} else { } else {
return response return response
} }
// TODO: 请求拦截
return response
}, },
error => { error => {
console.log('err' + error) // for debug console.log('err' + error) // for debug

View File

@ -77,7 +77,6 @@
<script> <script>
import { validUsername } from '@/utils/validate' import { validUsername } from '@/utils/validate'
import { login } from '@/api/user'
export default { export default {
name: 'Login', name: 'Login',
@ -125,19 +124,6 @@ export default {
}) })
}) })
}, },
login(data) {
return new Promise((resolve, reject) => {
login(data)
.then(res => {
const data = res.data
resolve(data)
})
.catch(err => {
reject(err)
console.log(err)
})
})
},
async handleLogin() { async handleLogin() {
this.loading = true this.loading = true
try { try {
@ -146,11 +132,10 @@ export default {
this.$message.error('请按要求填写表单!') this.$message.error('请按要求填写表单!')
return return
} }
const data = JSON.parse(JSON.stringify(this.loginForm)) const result = await this.$store.dispatch('user/login', this.loginForm)
const result = await this.login(data)
this.loading = false this.loading = false
this.$message.success('登录成功!') this.$message.success('登录成功!')
this.$router.push('/') this.$router.push({ path: this.redirect || '/' })
} catch (err) { } catch (err) {
this.loading = false this.loading = false
console.log(err) console.log(err)