Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Litemall
Commits
70f50e24
Commit
70f50e24
authored
Jan 31, 2019
by
Junling Bu
Browse files
feat[litemall-admin]: 前端的权限校验逻辑从roles换成perms
parent
b89d0c48
Changes
9
Hide whitespace changes
Inline
Side-by-side
litemall-admin/src/directive/permission/permission.js
View file @
70f50e24
...
...
@@ -4,20 +4,20 @@ import store from '@/store'
export
default
{
inserted
(
el
,
binding
,
vnode
)
{
const
{
value
}
=
binding
const
role
s
=
store
.
getters
&&
store
.
getters
.
role
s
const
perm
s
=
store
.
getters
&&
store
.
getters
.
perm
s
if
(
value
&&
value
instanceof
Array
&&
value
.
length
>
0
)
{
const
permission
Role
s
=
value
const
permissions
=
value
const
hasPermission
=
role
s
.
some
(
role
=>
{
return
permission
Role
s
.
includes
(
role
)
const
hasPermission
=
perm
s
.
some
(
perm
=>
{
return
permissions
.
includes
(
perm
)
})
if
(
!
hasPermission
)
{
el
.
parentNode
&&
el
.
parentNode
.
removeChild
(
el
)
}
}
else
{
throw
new
Error
(
`need
role
s! Like v-permission="['
admin','editor
']"`
)
throw
new
Error
(
`need
perm
s! Like v-permission="['
GET /aaa','POST /bbb
']"`
)
}
}
}
litemall-admin/src/lang/en.js
View file @
70f50e24
...
...
@@ -87,6 +87,7 @@ export default {
},
permission
:
{
roles
:
'
Your roles
'
,
perms
:
'
Your permissions
'
,
switchRoles
:
'
Switch roles
'
},
guide
:
{
...
...
litemall-admin/src/lang/zh.js
View file @
70f50e24
...
...
@@ -86,8 +86,9 @@ export default {
github
:
'
Github 地址
'
},
permission
:
{
roles
:
'
你的权限
'
,
switchRoles
:
'
切换权限
'
roles
:
'
你的角色
'
,
perms
:
'
你的权限
'
,
switchRoles
:
'
切换角色
'
},
guide
:
{
description
:
'
引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。本 Demo 是基于
'
,
...
...
litemall-admin/src/permission.js
View file @
70f50e24
...
...
@@ -8,10 +8,10 @@ import { getToken } from '@/utils/auth' // getToken from cookie
NProgress
.
configure
({
showSpinner
:
false
})
// NProgress Configuration
// permission judge function
function
hasPermission
(
role
s
,
permission
Role
s
)
{
if
(
role
s
.
indexOf
(
'
admin
'
)
>=
0
)
return
true
// admin permission passed directly
if
(
!
permission
Role
s
)
return
true
return
role
s
.
some
(
role
=>
permission
Role
s
.
indexOf
(
role
)
>=
0
)
function
hasPermission
(
perm
s
,
permissions
)
{
if
(
perm
s
.
indexOf
(
'
*
'
)
>=
0
)
return
true
// admin permission passed directly
if
(
!
permissions
)
return
true
return
perm
s
.
some
(
perm
=>
permissions
.
indexOf
(
perm
)
>=
0
)
}
const
whiteList
=
[
'
/login
'
,
'
/auth-redirect
'
]
// no redirect whitelist
...
...
@@ -24,10 +24,10 @@ router.beforeEach((to, from, next) => {
next
({
path
:
'
/
'
})
NProgress
.
done
()
// if current page is dashboard will not trigger afterEach hook, so manually handle it
}
else
{
if
(
store
.
getters
.
role
s
.
length
===
0
)
{
// 判断当前用户是否已拉取完user_info信息
if
(
store
.
getters
.
perm
s
.
length
===
0
)
{
// 判断当前用户是否已拉取完user_info信息
store
.
dispatch
(
'
GetUserInfo
'
).
then
(
res
=>
{
// 拉取user_info
const
role
s
=
res
.
data
.
data
.
role
s
// note:
role
s must be a array! such as: ['
editor','develop
']
store
.
dispatch
(
'
GenerateRoutes
'
,
{
role
s
}).
then
(()
=>
{
// 根据
role
s权限生成可访问的路由表
const
perm
s
=
res
.
data
.
data
.
perm
s
// note:
perm
s must be a array! such as: ['
GET /aaa','POST /bbb
']
store
.
dispatch
(
'
GenerateRoutes
'
,
{
perm
s
}).
then
(()
=>
{
// 根据
perm
s权限生成可访问的路由表
router
.
addRoutes
(
store
.
getters
.
addRouters
)
// 动态添加可访问路由表
next
({
...
to
,
replace
:
true
})
// hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
})
...
...
@@ -39,7 +39,7 @@ router.beforeEach((to, from, next) => {
})
}
else
{
// 没有动态改变权限的需求可直接next() 删除下方权限判断 ↓
if
(
hasPermission
(
store
.
getters
.
role
s
,
to
.
meta
.
role
s
))
{
if
(
hasPermission
(
store
.
getters
.
perm
s
,
to
.
meta
.
perm
s
))
{
next
()
}
else
{
next
({
path
:
'
/401
'
,
replace
:
true
,
query
:
{
noGoBack
:
true
}})
...
...
litemall-admin/src/router/index.js
View file @
70f50e24
...
...
@@ -18,7 +18,7 @@ import Layout from '@/views/layout/Layout'
* redirect: noredirect if `redirect:noredirect` will no redirect in the breadcrumb
* name:'router-name' the name is used by <keep-alive> (must set!!!)
* meta : {
role
s: ['
admin','editor
'] will control the page
role
s (you can set multiple
role
s)
perm
s: ['
GET /aaa','POST /bbb
'] will control the page
perm
s (you can set multiple
perm
s)
title: 'title' the name show in submenu and breadcrumb (recommend set)
icon: 'svg-name' the icon show in the sidebar,
noCache: true if true ,the page will no be cached(default is false)
...
...
litemall-admin/src/store/getters.js
View file @
70f50e24
...
...
@@ -11,6 +11,7 @@ const getters = {
introduction
:
state
=>
state
.
user
.
introduction
,
status
:
state
=>
state
.
user
.
status
,
roles
:
state
=>
state
.
user
.
roles
,
perms
:
state
=>
state
.
user
.
perms
,
setting
:
state
=>
state
.
user
.
setting
,
permission_routers
:
state
=>
state
.
permission
.
routers
,
addRouters
:
state
=>
state
.
permission
.
addRouters
...
...
litemall-admin/src/store/modules/permission.js
View file @
70f50e24
import
{
asyncRouterMap
,
constantRouterMap
}
from
'
@/router
'
/**
* 通过meta.
role
判断是否与当前用户权限匹配
* @param
role
s
* 通过meta.
perms
判断是否与当前用户权限匹配
* @param
perm
s
* @param route
*/
function
hasPermission
(
role
s
,
route
)
{
if
(
route
.
meta
&&
route
.
meta
.
role
s
)
{
return
role
s
.
some
(
role
=>
route
.
meta
.
role
s
.
includes
(
role
))
function
hasPermission
(
perm
s
,
route
)
{
if
(
route
.
meta
&&
route
.
meta
.
perm
s
)
{
return
perm
s
.
some
(
perm
=>
route
.
meta
.
perm
s
.
includes
(
perm
))
}
else
{
return
true
}
...
...
@@ -16,16 +16,16 @@ function hasPermission(roles, route) {
/**
* 递归过滤异步路由表,返回符合用户角色权限的路由表
* @param routes asyncRouterMap
* @param
role
s
* @param
perm
s
*/
function
filterAsyncRouter
(
routes
,
role
s
)
{
function
filterAsyncRouter
(
routes
,
perm
s
)
{
const
res
=
[]
routes
.
forEach
(
route
=>
{
const
tmp
=
{
...
route
}
if
(
hasPermission
(
role
s
,
tmp
))
{
if
(
hasPermission
(
perm
s
,
tmp
))
{
if
(
tmp
.
children
)
{
tmp
.
children
=
filterAsyncRouter
(
tmp
.
children
,
role
s
)
tmp
.
children
=
filterAsyncRouter
(
tmp
.
children
,
perm
s
)
}
res
.
push
(
tmp
)
}
...
...
@@ -48,12 +48,12 @@ const permission = {
actions
:
{
GenerateRoutes
({
commit
},
data
)
{
return
new
Promise
(
resolve
=>
{
const
{
role
s
}
=
data
const
{
perm
s
}
=
data
let
accessedRouters
if
(
role
s
.
includes
(
'
admin
'
))
{
if
(
perm
s
.
includes
(
'
*
'
))
{
accessedRouters
=
asyncRouterMap
}
else
{
accessedRouters
=
filterAsyncRouter
(
asyncRouterMap
,
role
s
)
accessedRouters
=
filterAsyncRouter
(
asyncRouterMap
,
perm
s
)
}
commit
(
'
SET_ROUTERS
'
,
accessedRouters
)
resolve
()
...
...
litemall-admin/src/store/modules/user.js
View file @
70f50e24
...
...
@@ -11,6 +11,7 @@ const user = {
avatar
:
''
,
introduction
:
''
,
roles
:
[],
perms
:
[],
setting
:
{
articlePlatform
:
[]
}
...
...
@@ -40,6 +41,9 @@ const user = {
},
SET_ROLES
:
(
state
,
roles
)
=>
{
state
.
roles
=
roles
},
SET_PERMS
:
(
state
,
perms
)
=>
{
state
.
perms
=
perms
}
},
...
...
@@ -65,12 +69,13 @@ const user = {
getUserInfo
(
state
.
token
).
then
(
response
=>
{
const
data
=
response
.
data
.
data
if
(
data
.
role
s
&&
data
.
role
s
.
length
>
0
)
{
// 验证返回的
role
s是否是一个非空数组
commit
(
'
SET_
ROLE
S
'
,
data
.
role
s
)
if
(
data
.
perm
s
&&
data
.
perm
s
.
length
>
0
)
{
// 验证返回的
perm
s是否是一个非空数组
commit
(
'
SET_
PERM
S
'
,
data
.
perm
s
)
}
else
{
reject
(
'
getInfo:
role
s must be a non-null array !
'
)
reject
(
'
getInfo:
perm
s must be a non-null array !
'
)
}
commit
(
'
SET_ROLES
'
,
data
.
roles
)
commit
(
'
SET_NAME
'
,
data
.
name
)
commit
(
'
SET_AVATAR
'
,
data
.
avatar
)
commit
(
'
SET_INTRODUCTION
'
,
data
.
introduction
)
...
...
@@ -101,6 +106,7 @@ const user = {
logout
(
state
.
token
).
then
(()
=>
{
commit
(
'
SET_TOKEN
'
,
''
)
commit
(
'
SET_ROLES
'
,
[])
commit
(
'
SET_PERMS
'
,
[])
removeToken
()
resolve
()
}).
catch
(
error
=>
{
...
...
@@ -126,6 +132,7 @@ const user = {
getUserInfo
(
role
).
then
(
response
=>
{
const
data
=
response
.
data
commit
(
'
SET_ROLES
'
,
data
.
roles
)
commit
(
'
SET_PERMS
'
,
data
.
perms
)
commit
(
'
SET_NAME
'
,
data
.
name
)
commit
(
'
SET_AVATAR
'
,
data
.
avatar
)
commit
(
'
SET_INTRODUCTION
'
,
data
.
introduction
)
...
...
litemall-admin/src/utils/permission.js
View file @
70f50e24
...
...
@@ -7,11 +7,11 @@ import store from '@/store'
*/
export
default
function
checkPermission
(
value
)
{
if
(
value
&&
value
instanceof
Array
&&
value
.
length
>
0
)
{
const
role
s
=
store
.
getters
&&
store
.
getters
.
role
s
const
permission
Role
s
=
value
const
perm
s
=
store
.
getters
&&
store
.
getters
.
perm
s
const
permissions
=
value
const
hasPermission
=
role
s
.
some
(
role
=>
{
return
permission
Role
s
.
includes
(
role
)
const
hasPermission
=
perm
s
.
some
(
perm
=>
{
return
permissions
.
includes
(
perm
)
})
if
(
!
hasPermission
)
{
...
...
@@ -19,7 +19,7 @@ export default function checkPermission(value) {
}
return
true
}
else
{
console
.
error
(
`need
role
s! Like v-permission="['
admin','editor
']"`
)
console
.
error
(
`need
perm
s! Like v-permission="['
GET /aaa','POST /bbb
']"`
)
return
false
}
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment