有一天忽然想到一個問題,web端的權限控制: 1.真的能控制權限嗎? 2.僅僅靠前端,能不能作到真正的權限控制? 3.若是須要後臺配合,應該如何配合? 可能這是一個老生常談的問題,但仍是想整理下,有誤的地方望你們指出。javascript
權限控制大體分爲兩個維度:html
SPA: 單頁Web應用(single page web application)將全部web活動侷限於一個html頁面中,利用js經過hash或者瀏覽器history api來實現無刷新路由跳轉,先後端經過ajax數據通訊,避免了瀏覽器的刷新從新加載,爲用戶提供流程的操做體驗。這意味着前端接管了路由層,須要經過調用前端自身的MVC模塊,來渲染不一樣的頁面。前端
Base on:java
// 1.觸發登錄事件
dispatch('login')
// actions
commit(types.LOGIN_SUCCESS, res.data.data)
...
複製代碼
// mutations
const mutations = {
[types.LOGIN_SUCCESS] (state, data) {
state.authlock = false
// 2.登錄成功回調拿到token,經Base64 編碼後存入本地sessionStorage
let token = Base64.encode(data + ':HIKDATAE')
sessionStorage.setItem('userToken', token)
// 路由跳轉至目標頁面
router.push({name: 'xxx'})
},
[types.LOGOUT_SUCCESS] (state) {
state.authlock = true
// 登出成功回調,移除本地token
sessionStorage.removeItem('userToken')
router.push({name: 'Login'})
}
}
複製代碼
// Axios 請求鉤子(request)
axios.interceptors.request.use(req => {
let token = sessionStorage.getItem('user')
if (token) {
// 3.token 存在,則在以後全部請求的http請求頭 Authorization 帶上base64編碼後的token,後臺拿到token後進行驗證權限
req.headers.Authorization = `Basic ${token}`
}
req.data = qs.stringify(req.data)
return req
}, error => {
return Promise.reject(error)
})
複製代碼
瀏覽器http headerios
// Axios 請求鉤子(response)
axios.interceptors.response.use(res => {
return res
}, error => {
if (error.response) {
switch (error.response.status) {
// 4.全部接口response校驗鉤子,若token檢驗失敗,後臺返回 401 error code, 清除token信息並跳轉到登陸頁面
case 401:
store.commit(types.LOGOUT)
router.replace({
path: '/login'
})
}
}
return Promise.reject(error)
})
複製代碼
// 路由鉤子(每一個路由跳轉前調起beforeEach鉤子)
router.beforeEach((to, from, next) => {
if (to.path === '/login') {
sessionStorage.removeItem('userToken')
}
let user = sessionStorage.getItem('userToken')
if (!user && to.path !== '/login') {
// 若本地token不存在,則任意路由跳轉的時候,重定向至login 登錄頁面
next({ path: '/login' })
} else {
next()
}
})
複製代碼
// mutations
const mutations = {
...
[types.LOGOUT_SUCCESS] (state) {
state.authlock = true
// 登出成功回調,移除本地token
sessionStorage.removeItem('userToken')
router.push({name: 'Login'})
}
}
複製代碼
寫完才以爲,什麼纔是真正的安全權限?任重而道遠。。。git
已同步至我的博客-軟硬皆施github
Github 歡迎star :)web