代码如同爬山,到山顶有很多条路,很难说哪条是最好,各有各的特点。
首先可以肯定的是,无论是那种权限验证,完成的方法有很多种,各有各的特点吧。
我就拿vue来举例吧
//这里可以设置白名单,例如当home页面你不需要限制。
const WhiteList = ['login','home']
router.beforeEach((to, from, next) => {
if(!WhiteList.includes(to.name)){
//在本地存储中获取token
const token = window.localStorage.getItem("token")
//token有值则用户已经登录,没有的话肯定就是还没登录
if(!token){
//没有登录则跳转到登录页面,fullPath不清楚的话可以去看一下vue-router的文档
next({
path:"/login",
query:{
redirect:to.fullPath
}
})
}
}
next()
})
login页面肯定是做登录的操作,这里我就只示例一下登录接口请求成功后的回调函数中的基本操作
function then(res){
//接受重定向过来传递的参数。这里有两种可能,1.是用户直接到login页面,2.是从其他页面跳转过来
const redirect = this.$route.query.redirect
//实际业务场景中肯定不止token,还会有更多的信息,我就只写token了。
window.localStorage.setItem('token',res.userData.token)
if(redirect){ //这种是从其他页面过来的情况,回到原页面
this.$router.replace({
path:redirect
})
}else{//用户直接登录login的情况,例如登录成功后到home页面去,具体的看实际业务需求
this.$router.replace({
path:"/home"
})
}
}
大致就是这样吧,当然如果业务逻辑复杂的话,这里可以根据具体的业务逻辑需求再细致化。
首先我们要清楚在我们前端和后端接口通信的时候,要将token放到请求头的 Authorization 中
,一同发给后台的。这个操作一般在请求拦截器中完成。
在请求拦截器中将token放到请求头中
axios.interceptors.request.use((config)=>{
let token = window.localStorage.getItem('token')
if(token){
config.headers.Authorization = token
}
return config
},(error)=>{
return Promise.reject(error)
})
后台判断接口是否需要权限,或者请求头中有没有token来决定是返回正常数据,还是返回 ‘401’
axios.interceptors.response.use((res)=>{
//这里做请求成功后的操作,具体看你架构怎么设计的,可以对后台返回的数据进行进一步处理
return response
},(error)=>{
//这里是请求失败的回调
//我们只需要判断是 ‘401’的话,就让其到登录页面
if(error.response.status == '401'){
//要知道还有登录过期的情况,后台也是返回 ‘401’,所以这里就要有如果是这种情况的处理
window.localStorage.removeItem('token')
//别忘了import引入router就行
router.replace({
path:'/login',
query:{
redirect:router.app.$router.funllPath
}
})
}
})
需要和后端沟通好,因为需要给一些接口设置白名单,不可能所有的接口都需要token验证
这样的业务逻辑设计一定要有清晰的思路,
- 1.哪些页面会一进来就有接口请求,
- 2.哪些页面需要用户进行一些操作才会发生接口请求;
- 3.甚至有些页面至始至终都不会有接口请求
那么像 第三种情况页面 在业务需求上是不是允许游客访问然后在游客操作的时候再提醒登录?
像 第二种情况页面 是不是在业务需求上就不需要做权限验证?
这些都要考虑清楚利弊,其实不存在哪种方法更好,只是它可能更适合你的业务需求。
一般较为复杂的项目,可能会有更深层的角色验证,最常见的是报表类或者后台管理系统的项目,
举个例子,
部门主管登录和普通员工登录,同一个项目,有可能有的页面部门主管就可以访问,而普通员工就无法访问。同一个页面,部门主管就会比普通员工看到的板块多。
像这种比较复杂的权限验证,需要后端要将什么角色能够访问什么页面以及什么板块配置在数据库中,
简单来说就是,数据库中 有这么一个表,专门来存储这种角色权限配置的,至于为什么这么做应该就不需要我在此进行赘述了吧
这里我们做权限验证可以通过路由的方式,也可以通过axios拦截器得方式完成。
这种是在页面的基础上加上同一个页面内,对于不同板块的权限验证。
这里就不得不提到vue的组件化开发;如果大家有过vue开发经验,那么相信肯定不会对组件这个概念陌生。
但是实际上,使用vue和组件化开发是两个概念,只能说vue能够完成组件化开发。但是也有一些人只是用了vue,但是却没有利用好组件这个东西,大致分为两类。
1.将多个页面有相似的模块提出来封装成公共组件,然后去复用这个组件,传递不同的数据参数,使其呈现不同的内容
2.页面中几乎全部被封装成了组件,然后页面就像搭积木一样,由多个组件组合而成。
角色模块权限验证,就需要组件化开发。
页面由多个组件组成,我们通过动态组件 (component)的方式来加载组件,至于加载那些组件,则由后台接口返回的信息来控制;不会有接口请求的页面,像这种情况跟着开发设计文档的要求走就可以了。
一定要注意对于样式的设计,多一个,少一个模块,页面布局会不会乱掉。这里可能对css样式的熟练度有点要求。
我代码的演示比较少,第一是我写的比较简单,不一定符合你的业务需求。第二就是无论是什么,一定要有自己的理解,并且灵活运用。不一定就要用哪种方式,有时候甚至可以参杂使用。
这只是我的个人的一些见解,不一定就好。当然肯定还有其他的方式,对于我们自己没有尝试过的方法,取其精华,去其糟粕才是王道。
最终希望大家能够明白一个道理。你认可的开发模式(设计模式。。。)不一定就是最好的,只是你比较认可它罢了,别人的也并非一文不值。