第七天: uni-app 最实用的单点登录及权限验证

Uni-app

20200519 uni-app 最实用的单点登录及权限验证

登录方法

/**
		 * 登录
		 */
		sumbit () {
			this.$http.post('/sys/User/login', this.dataForm).then(({ data: res }) => {
				// 存储token
				uni.setStorageSync('token', res.token)
				
				// 存储用户数据
				this.$store.dispatch('login', res.data).then(res => {
					// 判断登录成功是前往哪个页面
					let pageCur = getCurrentPages()
					uni.showToast({
					    title: '登录成功',
					    duration: 1000
					})
					if (pageCur[0].route !== 'pages/login/login') {
						uni.navigateBack()
					} else {
						uni.switchTab({
						    url: '/pages/tabbar/tabbar-1/tabbar-1'
						});
					}
				})
			})
		}
vux登录状态存储
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
	state: {
		user: {
			loginname: "",
			username: "",
			mobile: "",
			gender: null,
			email: "",
			createDate: "",
			status: ""
		}
	},
	mutations: {
		login(state, user) {
			state.user = user
			// 缓存用户信息
			uni.setStorageSync('user', JSON.stringify(user))
		},
		logout(state) {
			state.user = null
			// 清理缓存用户信息
			uni.removeStorageSync('user')
		}
	},
	actions: {
		login({
			commit
		}, params) {
			return new Promise((resolve, reject) => {
				commit('login', params)
				resolve()
			})
		},
		logout({
			commit
		}) {
			commit('logout')
		}
	},
	getters: {
		user: state => {
			let user = uni.getStorageInfoSync('user')
			return JSON.parse(user)
		}
	}
})

export default store

请求拦截器,登录状态验证
import uniRequest from '@/node_modules/uni-request/index.js';
import config from '@/config/index.js' // 全局域名配置

/**
 * 提供的方法有
 * uniRequest.request(config)
 * uniRequest.get(url[, config])
 * uniRequest.delete(url[, config])
 * uniRequest.head(url[, config])
 * uniRequest.options(url[, config])
 * uniRequest.post(url[, data[, config]])
 * uniRequest.put(url[, data[, config]])
 * uniRequest.patch(url[, data[, config]])
 * 
 */

// 全局配置
uniRequest.defaults.baseURL = config.baseUrl
// 请求拦截
uniRequest.interceptors.request.use(config => {
	// 赋值token
	config.headers.token = uni.getStorageSync('token') || new Date().getTime()
	// 防止缓存,GET请求默认带_t参数
	if (config.method === 'get') {
		config.params = {
		  ...config.params,
		  ...{ '_t': new Date().getTime() }
		}
	}
	return config;
},err => {
	return Promise.reject(err);
});

// 响应拦截
uniRequest.interceptors.response.use((response) => {
	if (response.data.code === 401) {
		uni.showToast({
		    title: '登录失效,请重新登录',
			icon: 'none',
		    duration: 2000
		});
		setTimeout(function(){
			uni.navigateTo({ url: '/pages/login/login' })
		}, 1500)
		return Promise.reject(response.data.msg)
	}
	
	if (response.data.code === 1002) {
		uni.showToast({
		    title: response.data.msg,
			icon: 'none',
		    duration: 2000
		});
		return Promise.reject(response.data.msg)
	}
	return Promise.resolve(response);
}, (err) => {
	if (err && err.response) {
		switch (err.response.status) {
		  case 301: err.message = '请求的数据具有新的位置且更改是永久的'; break
		  case 302: err.message = '请求的数据临时具有不同 URI'; break
		  case 304: err.message = '未按预期修改文档'; break
		  case 305: err.message = '必须通过代理来访问请求的资源'; break
		  case 400: err.message = '请求中有语法问题,或不能满足请求'; break
		  case 402: err.message = '所使用的模块需要付费使用'; break
		  case 403: err.message = '当前操作没有权限'; break
		  case 404: err.message = '服务器找不到给定的资源'; break
		  case 407: err.message = '客户机首先必须使用代理认证自身'; break
		  case 415: err.message = '请求类型不支持,服务器拒绝服务'; break
		  case 417: err.message = '未绑定登录账号,请使用密码登录后绑定'; break
		  case 426: err.message = '用户名不存在或密码错误'; break
		  case 429: err.message = '请求过于频繁'; break
		  case 500: err.message = '服务器内部错误,无法完成请求'; break
		  case 501: err.message = '服务不支持请求'; break
		  case 502: err.message = '网络错误,服务器接收到上上游服务器无效响应'; break
		  case 503: err.message = '服务器无法处理请求'; break
		  case 504: err.message = '网络请求超时'; break
		  case 999: err.message = '系统未知错误,请反馈给管理员'; break
		}
	} else {
		err.message = '连接服务器失败!'
	}
	uni.showToast({
	    title: err.message,
		icon: 'none',
	    duration: 2000
	});
	return Promise.reject(err);
});


export default uniRequest
  • 11
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Vue 路由守卫是一种机制,用于在用户路由切换时对其进行监控和控制。路由鉴权是一种安全机制,用于验证用户是否有权限访问某个特定的路由或页面。 在 Vue 中,我们可以使用路由守卫来实现路由鉴权。路由守卫有三种类型:全局前置守卫、路由独享守卫和组件内的守卫。 全局前置守卫通过在创建 Vue Router 实例时添加 `beforeEach` 方法来实现。该方法接受一个回调函数,在每次路由切换前被触发。我们可以在回调函数中进行权限验证,例如判断用户是否登录以及是否有权限访问该路由。如果用户没有权限,我们可以通过 `next(false)` 或者 `next('/login')` 来中断路由导航或者跳转到登录页面。 路由独享守卫可以在路由配置中单独为某个路由添加 `beforeEnter` 方法来实现。该方法与全局前置守卫类似,可以在其中进行权限验证。 组件内的守卫包括 `beforeRouteEnter`、`beforeRouteUpdate` 和 `beforeRouteLeave`。这些守卫可以在组件内部使用,用于对组件内的路由进行验证和处理。例如,在 `beforeRouteEnter` 守卫中,我们可以通过回调函数的参数 `next` 来控制路由导航,判断用户是否有权限访问该路由。 使用路由守卫和路由鉴权可以有效地保护应用程序的安全性。通过在路由切换时进行权限验证,可以防止未授权的用户访问受限页面,并且可以根据需求进行灵活的权限控制。这是一个非常重要的概念,特别是在需要保护用户隐私和敏感数据的应用程序中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huang-ioi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值