Merge pull request #100 from jumpserver/dev

[hotfix]更改路由权限验证模块
This commit is contained in:
老广 2020-06-22 18:42:42 +08:00 committed by GitHub
commit 57e4b65059
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 176 additions and 90 deletions

View File

@ -1,2 +1,3 @@
lina
dist dist
node_modules node_modules

View File

@ -2,4 +2,5 @@ build/*.js
src/assets src/assets
public public
dist dist
lina
node_modules node_modules

1
.gitignore vendored
View File

@ -1,6 +1,7 @@
.DS_Store .DS_Store
node_modules/ node_modules/
dist/ dist/
lina/
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*

View File

@ -8,5 +8,5 @@ RUN yarn build:prod
FROM nginx:alpine FROM nginx:alpine
COPY --from=stage-build /data/dist /opt/lina/ COPY --from=stage-build /data/lina /opt/lina/
COPY nginx.conf /etc/nginx/conf.d/default.conf COPY nginx.conf /etc/nginx/conf.d/default.conf

View File

@ -1,32 +1,41 @@
import i18n from '@/i18n/i18n' import i18n from '@/i18n/i18n'
import empty from '@/layout/empty'
export default [ export default [
{ {
path: 'remote-apps', path: 'remote-apps',
name: 'RemoteAppList', redirect: '',
component: () => import('@/views/applications/RemoteApp/RemoteAppList'), component: empty,
meta: { title: i18n.t('route.RemoteApp'), licenseRequired: true } meta: { title: i18n.t('route.RemoteApp'), licenseRequired: true },
}, children: [
{ {
path: 'remote-apps/create', path: '',
name: 'RemoteAppCreate', name: 'RemoteAppList',
component: () => import('@/views/applications/RemoteApp/RemoteAppCreateUpdate'), meta: { title: i18n.t('route.RemoteApp') },
meta: { title: i18n.t('route.RemoteApp'), activeMenu: '/applications/remote-apps', action: 'create', licenseRequired: true }, component: () => import('@/views/applications/RemoteApp/RemoteAppList')
hidden: true },
}, {
{ path: 'create',
path: 'remote-apps/:id/update', name: 'RemoteAppCreate',
name: 'RemoteAppUpdate', component: () => import('@/views/applications/RemoteApp/RemoteAppCreateUpdate'),
component: () => import('@/views/applications/RemoteApp/RemoteAppCreateUpdate'), meta: { title: i18n.t('route.RemoteApp'), activeMenu: '/applications/remote-apps', action: 'create' },
meta: { title: i18n.t('route.RemoteAppUpdate'), activeMenu: '/applications/remote-apps', action: 'update', licenseRequired: true }, hidden: true
hidden: true },
}, {
{ path: ':id/update',
path: 'remote-apps/:id', name: 'RemoteAppUpdate',
name: 'RemoteAppDetail', component: () => import('@/views/applications/RemoteApp/RemoteAppCreateUpdate'),
component: () => import('@/views/applications/RemoteApp/RemoteAppDetail/index'), meta: { title: i18n.t('route.RemoteAppUpdate'), activeMenu: '/applications/remote-apps', action: 'update' },
meta: { title: i18n.t('route.RemoteAppDetail'), activeMenu: '/applications/remote-apps', licenseRequired: true }, hidden: true
hidden: true },
{
path: ':id',
name: 'RemoteAppDetail',
component: () => import('@/views/applications/RemoteApp/RemoteAppDetail/index'),
meta: { title: i18n.t('route.RemoteAppDetail'), activeMenu: '/applications/remote-apps' },
hidden: true
}
]
}, },
{ {
path: 'database-apps', path: 'database-apps',

View File

@ -105,6 +105,7 @@ export const allRoleRoutes = [
component: Layout, component: Layout,
redirect: '/applications/remote-apps/', redirect: '/applications/remote-apps/',
name: 'applications', name: 'applications',
alwaysShow: true,
meta: { title: i18n.t('route.Applications'), icon: 'th' }, meta: { title: i18n.t('route.Applications'), icon: 'th' },
children: ApplicationsRoute children: ApplicationsRoute
}, },
@ -129,6 +130,7 @@ export const allRoleRoutes = [
component: Layout, component: Layout,
redirect: '/ops/tasks/', redirect: '/ops/tasks/',
name: 'JobCenter', name: 'JobCenter',
alwaysShow: true,
meta: { title: i18n.t('route.JobCenter'), icon: 'coffee' }, meta: { title: i18n.t('route.JobCenter'), icon: 'coffee' },
children: OpsRoutes children: OpsRoutes
}, },

View File

@ -1,5 +1,5 @@
import i18n from '@/i18n/i18n' import i18n from '@/i18n/i18n'
import rolec from '@/utils/role'
export default [ export default [
{ {
path: 'tasks', path: 'tasks',
@ -45,6 +45,6 @@ export default [
path: 'task/monitor', path: 'task/monitor',
name: 'TaskMonitor', name: 'TaskMonitor',
component: () => window.open(`/core/flower?_=${Date.now()}`), component: () => window.open(`/core/flower?_=${Date.now()}`),
meta: { title: i18n.t('route.TaskMonitor') } meta: { title: i18n.t('route.TaskMonitor'), permissions: [rolec.PERM_SUPER] }
} }
] ]

View File

@ -1,4 +1,5 @@
import i18n from '@/i18n/i18n' import i18n from '@/i18n/i18n'
import empty from '@/layout/empty'
const assetPermissionRoutes = [ const assetPermissionRoutes = [
{ {
@ -33,31 +34,40 @@ const assetPermissionRoutes = [
const remoteAppPermissionRoutes = [ const remoteAppPermissionRoutes = [
{ {
path: 'remote-app-permissions', path: 'remote-app-permissions',
name: 'RemoteAppPermissionList', component: empty,
component: () => import('@/views/perms/RemoteAppPermission/RemoteAppPermissionList'), meta: { title: i18n.t('route.RemoteAppPermission'), licenseRequired: true },
meta: { title: i18n.t('route.RemoteAppPermission') } redirect: '',
}, children: [
{ {
path: 'remote-app-permissions/create', path: '',
component: () => import('@/views/perms/RemoteAppPermission/RemoteAppPermissionCreateUpdate'), name: 'RemoteAppPermissionList',
name: 'RemoteAppPermissionCreate', component: () => import('@/views/perms/RemoteAppPermission/RemoteAppPermissionList'),
hidden: true, meta: { title: i18n.t('route.RemoteAppPermission') }
meta: { title: i18n.t('route.RemoteAppPermissionCreate'), activeMenu: '/perms/remote-app-permissions', action: 'create' }
}, },
{ {
path: 'remote-app-permissions/update', path: 'create',
component: () => import('@/views/perms/RemoteAppPermission/RemoteAppPermissionCreateUpdate'), component: () => import('@/views/perms/RemoteAppPermission/RemoteAppPermissionCreateUpdate'),
name: 'RemoteAppPermissionUpdate', name: 'RemoteAppPermissionCreate',
hidden: true, hidden: true,
meta: { title: i18n.t('route.RemoteAppPermissionUpdate'), activeMenu: '/perms/remote-app-permissions', action: 'update' } meta: { title: i18n.t('route.RemoteAppPermissionCreate'), activeMenu: '/perms/remote-app-permissions', action: 'create' }
}, },
{ {
path: 'remote-app-permissions/:id', path: 'update',
component: () => import('@/views/perms/RemoteAppPermission/RemoteAppPermissionDetail/index'), component: () => import('@/views/perms/RemoteAppPermission/RemoteAppPermissionCreateUpdate'),
name: 'RemoteAppPermissionDetail', name: 'RemoteAppPermissionUpdate',
hidden: true, hidden: true,
meta: { title: i18n.t('route.RemoteAppPermissionDetail'), activeMenu: '/perms/remote-app-permissions' } meta: { title: i18n.t('route.RemoteAppPermissionUpdate'), activeMenu: '/perms/remote-app-permissions', action: 'update' }
},
{
path: ':id',
component: () => import('@/views/perms/RemoteAppPermission/RemoteAppPermissionDetail/index'),
name: 'RemoteAppPermissionDetail',
hidden: true,
meta: { title: i18n.t('route.RemoteAppPermissionDetail'), activeMenu: '/perms/remote-app-permissions' }
}]
} }
] ]
const databasePermissionRoutes = [ const databasePermissionRoutes = [

View File

@ -1,5 +1,6 @@
import i18n from '@/i18n/i18n' import i18n from '@/i18n/i18n'
import rolec from '@/utils/role' import rolec from '@/utils/role'
import empty from '@/layout/empty'
export default [ export default [
{ {
path: 'session', path: 'session',
@ -34,57 +35,65 @@ export default [
}, },
{ {
path: 'terminal', path: 'terminal',
name: 'TerminalList', component: empty,
component: () => import('@/views/sessions/TerminalList'), redirect: '',
meta: { title: i18n.t('route.Terminal') } meta: { title: i18n.t('route.Terminal'), permissions: [rolec.PERM_SUPER] },
}, children: [
{ {
path: 'terminals/:id', path: '',
name: 'TerminalDetail', name: 'TerminalList',
component: () => import('@/views/sessions/TerminalDetail'), component: () => import('@/views/sessions/TerminalList'),
meta: { title: i18n.t('route.Terminal'), activeMenu: '/terminal/terminal' }, meta: { title: i18n.t('route.Terminal') }
hidden: true },
}, {
{ path: ':id',
path: 'terminals/:id/update', name: 'TerminalDetail',
name: 'TerminalUpdate', component: () => import('@/views/sessions/TerminalDetail'),
component: () => import('@/views/sessions/TerminalUpdate'), meta: { title: i18n.t('route.Terminal'), activeMenu: '/terminal/terminal' },
meta: { title: i18n.t('route.Terminal'), activeMenu: '/terminal/terminal' }, hidden: true
hidden: true },
{
path: ':id/update',
name: 'TerminalUpdate',
component: () => import('@/views/sessions/TerminalUpdate'),
meta: { title: i18n.t('route.Terminal'), activeMenu: '/terminal/terminal' },
hidden: true
}
]
}, },
{ {
path: 'storages', path: 'storages',
name: 'Storage', name: 'Storage',
component: () => import('@/views/sessions/Storage/index'), component: () => import('@/views/sessions/Storage/index'),
meta: { activeMenu: '/terminal/terminal' }, meta: { activeMenu: '/terminal/terminal', permissions: [rolec.PERM_SUPER] },
hidden: true hidden: true
}, },
{ {
path: 'replay-storage/create', path: 'replay-storage/create',
name: 'CreateReplayStorage', name: 'CreateReplayStorage',
component: () => import('@/views/sessions/ReplayStorageCreateUpdate'), component: () => import('@/views/sessions/ReplayStorageCreateUpdate'),
meta: { title: i18n.t('route.CreateReplayStorage'), activeMenu: '/terminal/terminal' }, meta: { title: i18n.t('route.CreateReplayStorage'), activeMenu: '/terminal/terminal', permissions: [rolec.PERM_SUPER] },
hidden: true hidden: true
}, },
{ {
path: 'command-storage/create', path: 'command-storage/create',
name: 'CreateCommandStorage', name: 'CreateCommandStorage',
component: () => import('@/views/sessions/CommandStorageCreateUpdate'), component: () => import('@/views/sessions/CommandStorageCreateUpdate'),
meta: { title: i18n.t('route.CreateCommandStorage'), activeMenu: '/terminal/terminal' }, meta: { title: i18n.t('route.CreateCommandStorage'), activeMenu: '/terminal/terminal', permissions: [rolec.PERM_SUPER] },
hidden: true hidden: true
}, },
{ {
path: 'replay-storage/:id/update', path: 'replay-storage/:id/update',
name: 'ReplayStorageUpdate', name: 'ReplayStorageUpdate',
component: () => import('@/views/sessions/ReplayStorageCreateUpdate'), component: () => import('@/views/sessions/ReplayStorageCreateUpdate'),
meta: { title: i18n.t('route.ReplayStorageUpdate'), activeMenu: '/terminal/terminal' }, meta: { title: i18n.t('route.ReplayStorageUpdate'), activeMenu: '/terminal/terminal', permissions: [rolec.PERM_SUPER] },
hidden: true hidden: true
}, },
{ {
path: 'command-storage/:id/update', path: 'command-storage/:id/update',
name: 'CommandStorageUpdate', name: 'CommandStorageUpdate',
component: () => import('@/views/sessions/CommandStorageCreateUpdate'), component: () => import('@/views/sessions/CommandStorageCreateUpdate'),
meta: { title: i18n.t('route.CommandStorageUpdate'), activeMenu: '/terminal/terminal' }, meta: { title: i18n.t('route.CommandStorageUpdate'), activeMenu: '/terminal/terminal', permissions: [rolec.PERM_SUPER] },
hidden: true hidden: true
} }
] ]

View File

@ -33,13 +33,14 @@ export default [
name: 'Apps', name: 'Apps',
component: Layout, component: Layout,
redirect: '/apps/remoteapp', redirect: '/apps/remoteapp',
alwaysShow: true,
meta: { title: i18n.t('route.MyApps'), icon: 'th', permissions: [rolec.PERM_USE] }, meta: { title: i18n.t('route.MyApps'), icon: 'th', permissions: [rolec.PERM_USE] },
children: [ children: [
{ {
path: '/apps/remoteapp', path: '/apps/remoteapp',
name: 'MyRemoteApps', name: 'MyRemoteApps',
component: () => import('@/userviews/apps/RemoteApp'), component: () => import('@/userviews/apps/RemoteApp'),
meta: { title: i18n.t('route.RemoteApp'), permissions: [rolec.PERM_USE] } meta: { title: i18n.t('route.RemoteApp'), permissions: [rolec.PERM_USE], licenseRequired: true }
}, },
{ {
path: '/apps/database', path: '/apps/database',

View File

@ -28,15 +28,16 @@ function hasLicense(licState, route) {
return licState === requireLic return licState === requireLic
} }
function hasCommand(cmdState, route) { function hasCommand(cmdBulkExecutionEnable, route) {
if (cmdState) { const routeRequireCmd = route.meta ? route.meta.commandExecutionRequired : false
return cmdState if (!routeRequireCmd) {
return true
} }
let requireCmd = route.meta ? route.meta.commandExecutionRequired : null
if (!requireCmd) { if (!cmdBulkExecutionEnable) {
requireCmd = false return false
} }
return cmdState === requireCmd return true
} }
export function filterLicRoutes(routes, roles) { export function filterLicRoutes(routes, roles) {
@ -113,10 +114,12 @@ const mutations = {
const actions = { const actions = {
generateRoutes({ commit, rootState }, roles) { generateRoutes({ commit, rootState }, roles) {
return new Promise(resolve => { return new Promise(resolve => {
console.log(rootState)
let accessedRoutes = filterAsyncRoutes(allRoleRoutes, roles) let accessedRoutes = filterAsyncRoutes(allRoleRoutes, roles)
accessedRoutes = filterCmdRoutes(accessedRoutes, rootState.settings.publicSettings.SECURITY_COMMAND_EXECUTION) accessedRoutes = filterCmdRoutes(accessedRoutes, rootState.settings.publicSettings.SECURITY_COMMAND_EXECUTION)
accessedRoutes = filterLicRoutes(accessedRoutes, rootState.settings.publicSettings.XPACK_ENABLED) accessedRoutes = filterLicRoutes(accessedRoutes, rootState.settings.publicSettings.XPACK_LICENSE_IS_VALID)
if (accessedRoutes.length === 0) {
console.log('No route find')
}
commit('SET_ROUTES', accessedRoutes) commit('SET_ROUTES', accessedRoutes)
resolve(accessedRoutes) resolve(accessedRoutes)
}) })

View File

@ -49,7 +49,7 @@ service.interceptors.request.use(
) )
function ifUnauthorized({ response, error }) { function ifUnauthorized({ response, error }) {
if (response.status === 401 && response.request.url.indexOf('/users/profile') !== -1) { if (response.status === 401 && response.request.responseURL.indexOf('/users/profile') === -1) {
response.config.disableFlashErrorMsg = true response.config.disableFlashErrorMsg = true
// 未授权重定向到登录页面 // 未授权重定向到登录页面
const title = i18n.t('common.Info') const title = i18n.t('common.Info')

View File

@ -103,7 +103,7 @@ export default {
window.open(replayUrl) window.open(replayUrl)
}, },
openReplayDownload: function(id) { openReplayDownload: function(id) {
const downloadUrl = '/api/v1/terminal/session/00000000-0000-0000-0000-000000000000/replay/download/' const downloadUrl = '/api/v1/terminal/sessions/00000000-0000-0000-0000-000000000000/replay/download/'
.replace('00000000-0000-0000-0000-000000000000', id) .replace('00000000-0000-0000-0000-000000000000', id)
window.open(downloadUrl) window.open(downloadUrl)
} }

View File

@ -130,13 +130,58 @@ export default {
} }
}, },
basicData(data) { basicData(data) {
return data.basic const basic = data.basic
if (basic.SITE_URL === null) {
basic.SITE_URL = ''
}
if (basic.EMAIL_SUBJECT_PREFIX === null) {
basic.EMAIL_SUBJECT_PREFIX = ''
}
if (basic.USER_GUIDE_URL === null) {
basic.USER_GUIDE_URL = ''
}
return basic
}, },
emailData(data) { emailData(data) {
return data.email const email = data.email
if (email.EMAIL_FROM === null) {
email.EMAIL_FROM = ''
}
if (email.EMAIL_RECIPIENT === null) {
email.EMAIL_RECIPIENT = ''
}
if (email.EMAIL_USE_TLS === null) {
email.EMAIL_USE_TLS = false
}
if (email.EMAIL_HOST === null) {
email.EMAIL_HOST = ''
}
if (email.EMAIL_HOST_USER === null) {
email.EMAIL_HOST_USER = ''
}
if (email.EMAIL_PORT === null) {
email.EMAIL_PORT = ''
}
if (email.EMAIL_USE_SSL === null) {
email.EMAIL_USE_SSL = false
}
return email
}, },
emailContentData(data) { emailContentData(data) {
return data.email_content const email_content = data.email_content
if (email_content.EMAIL_CUSTOM_USER_CREATED_BODY === null) {
email_content.EMAIL_CUSTOM_USER_CREATED_BODY = ''
}
if (email_content.EMAIL_CUSTOM_USER_CREATED_HONORIFIC === null) {
email_content.EMAIL_CUSTOM_USER_CREATED_HONORIFIC = ''
}
if (email_content.EMAIL_CUSTOM_USER_CREATED_SIGNATURE === null) {
email_content.EMAIL_CUSTOM_USER_CREATED_SIGNATURE = ''
}
if (email_content.EMAIL_CUSTOM_USER_CREATED_SUBJECT === null) {
email_content.EMAIL_CUSTOM_USER_CREATED_SUBJECT = ''
}
return email_content
}, },
ldapData(data) { ldapData(data) {
return data.ldap return data.ldap
@ -145,7 +190,11 @@ export default {
return data.terminal return data.terminal
}, },
securityData(data) { securityData(data) {
return data.security const security = data.security
if (security.SECURITY_COMMAND_EXECUTION === null) {
security.SECURITY_COMMAND_EXECUTION = false
}
return security
} }
} }
} }

View File

@ -29,7 +29,7 @@ module.exports = {
/\/node_modules\/resize-detector\// /\/node_modules\/resize-detector\//
], ],
publicPath: '/ui/', publicPath: '/ui/',
outputDir: 'dist', outputDir: 'lina',
assetsDir: 'assets', assetsDir: 'assets',
lintOnSave: process.env.NODE_ENV === 'development', lintOnSave: process.env.NODE_ENV === 'development',
productionSourceMap: false, productionSourceMap: false,