提交 710a0132 编写于 作者: DCloud_JSON's avatar DCloud_JSON

1. 强制登陆配置,新增白名单模式 2. 强制登陆配置,支持正则表达式

上级 59eb3a0b
## 1.0.39(2021-07-19)
1. 强制登陆配置,新增白名单模式
2. 强制登陆配置,支持正则表达式
## 1.0.38(2021-07-17)
删除多余文件
## 1.0.37(2021-07-14)
......
......@@ -9,25 +9,25 @@ import interceptorChooseImage from '@/uni_modules/json-interceptor-chooseImage/j
const db = uniCloud.database()
export default async function() {
let loginConfig = uniStarterConfig.router.login
//清除有配置但设备环境不支持的登陆项
//清除有配置但设备环境不支持的登陆项
// #ifdef APP-PLUS
await new Promise((callBack)=>{
await new Promise((callBack) => {
plus.oauth.getServices(oauthServices => {
loginConfig = loginConfig.filter(item=>{
if(["univerify", "weixin", "apple"].includes(item)){
let index = oauthServices.findIndex(e=>e.id==item)
if(index==-1){
loginConfig = loginConfig.filter(item => {
if (["univerify", "weixin", "apple"].includes(item)) {
let index = oauthServices.findIndex(e => e.id == item)
if (index == -1) {
return false
}else{
} else {
return oauthServices[index].nativeClient
}
}else{
} else {
return true
}
})
if(loginConfig.includes('univerify')){ //一键登录 功能预登录
if (loginConfig.includes('univerify')) { //一键登录 功能预登录
uni.preLogin({
provider:'univerify',
provider: 'univerify',
complete: e => {
console.log(e);
}
......@@ -42,7 +42,7 @@ export default async function() {
//非app移除:一键登录、苹果登陆;h5移除微信登陆,如果你做微信公众号登陆需要将此行移除
// #ifndef APP-PLUS
loginConfig = loginConfig.filter(item=>{
loginConfig = loginConfig.filter(item => {
return ![
'univerify',
'apple',
......@@ -56,9 +56,11 @@ export default async function() {
uniStarterConfig.router.login = loginConfig
// uniStarterConfig挂载到getApp().globalData.config
setTimeout(()=>{
getApp({allowDefault: true}).globalData.config = uniStarterConfig;
},1)
setTimeout(() => {
getApp({
allowDefault: true
}).globalData.config = uniStarterConfig;
}, 1)
// 初始化appVersion(仅app生效)
......@@ -77,16 +79,16 @@ export default async function() {
}) {
console.log('onDBError');
// 处理错误
console.log(code,message);
if([
console.log(code, message);
if ([
'TOKEN_INVALID_INVALID_CLIENTID',
'TOKEN_INVALID',
'TOKEN_INVALID_TOKEN_EXPIRED',
'TOKEN_INVALID_WRONG_TOKEN',
'TOKEN_INVALID_ANONYMOUS_USER',
].includes(code)){
].includes(code)) {
uni.navigateTo({
url:'/pages/ucenter/login-page/index/index'
url: '/pages/ucenter/login-page/index/index'
})
}
}
......@@ -99,7 +101,10 @@ export default async function() {
token,
tokenExpired
}) {
console.log('监听到clientDB的refreshToken',{token,tokenExpired});
console.log('监听到clientDB的refreshToken', {
token,
tokenExpired
});
store.commit('user/login', {
token,
tokenExpired
......@@ -109,81 +114,84 @@ export default async function() {
const Debug = true;
//拦截器封装callFunction
let callFunctionOption;
uniCloud.addInterceptor('callFunction',{
async invoke(option){
uniCloud.addInterceptor('callFunction', {
async invoke(option) {
// #ifdef APP-PLUS
// 判断如果是执行登陆(无论是哪种登陆方式),就记录用户的相关设备id
if(option.name == 'uni-id-cf'&&(option.data.action == 'register' || option.data.action.slice(0,5) =='login')){
let oaid = await new Promise((callBack,fail)=>{
if (option.name == 'uni-id-cf' && (option.data.action == 'register' || option.data.action.slice(0, 5) == 'login')) {
let oaid = await new Promise((callBack, fail) => {
if (uni.getSystemInfoSync().platform == "android") {
plus.device.getOAID({
success:function(e){
success: function(e) {
callBack(e.oaid)
// console.log('getOAID success: '+JSON.stringify(e));
},
fail:function(e){
fail: function(e) {
callBack()
console.log('getOAID failed: '+JSON.stringify(e));
console.log('getOAID failed: ' + JSON.stringify(e));
}
});
}else{
} else {
callBack()
}
})
let imei = await new Promise((callBack,fail)=>{
let imei = await new Promise((callBack, fail) => {
if (uni.getSystemInfoSync().platform == "android") {
plus.device.getInfo({
success:function(e){
success: function(e) {
callBack(e.imei)
// console.log('getOAID success: '+JSON.stringify(e));
},
fail:function(e){
fail: function(e) {
callBack()
console.log('getOAID failed: '+JSON.stringify(e));
console.log('getOAID failed: ' + JSON.stringify(e));
}
});
}else{
} else {
callBack()
}
})
let push_clientid = '',
idfa = plus.storage.getItem('idfa')||'';//idfa有需要的用户在应用首次启动时自己获取存储到storage中
idfa = plus.storage.getItem('idfa') || ''; //idfa有需要的用户在应用首次启动时自己获取存储到storage中
try{
try {
push_clientid = plus.push.getClientInfo().clientid
}catch(e){
} catch (e) {
uni.showModal({
content: '获取推送标识失败。如果你的应用不需要推送功能,请注释掉本代码块',
showCancel: false,
confirmText:"好的"
confirmText: "好的"
});
console.log(e)
}
let deviceInfo = {
push_clientid,// 获取匿名设备标识符
imei,oaid,idfa
push_clientid, // 获取匿名设备标识符
imei,
oaid,
idfa
}
console.log("重新登陆/注册,获取设备id",deviceInfo);
console.log("重新登陆/注册,获取设备id", deviceInfo);
option.data.deviceInfo = deviceInfo
// #ifndef H5
//注册可能不仅仅走register接口,还有登陆并注册的接口
option.data.inviteCode = await new Promise((callBack)=>{
option.data.inviteCode = await new Promise((callBack) => {
uni.getClipboardData({
success: function (res) {
if(res.data.slice(0,18) =='uniInvitationCode:'){
let uniInvitationCode = res.data.slice(18,38)
console.log('当前用户是其他用户推荐下载的,推荐者的code是:'+uniInvitationCode);
success: function(res) {
if (res.data.slice(0, 18) == 'uniInvitationCode:') {
let uniInvitationCode = res.data.slice(18, 38)
console.log('当前用户是其他用户推荐下载的,推荐者的code是:' +
uniInvitationCode);
// uni.showModal({
// content: '当前用户是其他用户推荐下载的,推荐者的code是:'+uniInvitationCode,
// showCancel: false
// });
callBack(uniInvitationCode)
//当前用户是其他用户推荐下载的。这里登记他的推荐者id 为当前用户的myInviteCode。判断如果是注册
}else{
} else {
callBack(false)
}
},
......@@ -198,26 +206,26 @@ export default async function() {
// console.log(JSON.stringify(option));
callFunctionOption = option
},
complete(e){
complete(e) {
// console.log(JSON.stringify(e));
},
fail(e) { // 失败回调拦截
if(Debug){
if (Debug) {
uni.showModal({
content:JSON.stringify(e),
content: JSON.stringify(e),
showCancel: false
});
console.error(e);
}else{
} else {
uni.showModal({
content: "系统错误请稍后再试!",
showCancel: false,
confirmText:"知道了"
confirmText: "知道了"
});
}
//如果执行错误,检查是否断网
uni.getNetworkType({
complete:res => {
complete: res => {
// console.log(res);
if (res.networkType == 'none') {
uni.showToast({
......@@ -225,16 +233,16 @@ export default async function() {
icon: 'none'
});
console.log('手机网络异常');
let callBack = res=>{
let callBack = res => {
console.log(res);
if (res.isConnected) {
uni.showToast({
title: '恢复联网自动重新执行',
icon: 'none'
});
console.log(res.networkType,"恢复联网自动重新执行");
uni.offNetworkStatusChange(e=>{
console.log("移除监听成功",e);
console.log(res.networkType, "恢复联网自动重新执行");
uni.offNetworkStatusChange(e => {
console.log("移除监听成功", e);
})
//恢复联网自动重新执行
uniCloud.callFunction(callFunctionOption)
......@@ -246,16 +254,19 @@ export default async function() {
}
});
},
success:(e)=>{
success: (e) => {
console.log(e);
const {token,tokenExpired} = e.result
const {
token,
tokenExpired
} = e.result
if (token && tokenExpired) {
store.commit('user/login', {
token,
tokenExpired
})
}
switch (e.result.code){
switch (e.result.code) {
case 403:
uni.navigateTo({
url: "/pages/ucenter/login-page/index/index"
......@@ -270,49 +281,81 @@ export default async function() {
uni.showToast({
title: e.result.msg,
icon: 'none',
duration:2000
duration: 2000
});
break;
default:
console.log('code的值是:'+e.result.code,'可以在这里插入,自动处理响应体');
console.log('code的值是:' + e.result.code, '可以在这里插入,自动处理响应体');
break;
}
}
})
//自定义路由拦截
const {"router": {needLogin,login} } = uniStarterConfig //需要登录的页面
const {
"router": {
needLogin,
visitor,
login
}
} = uniStarterConfig //需要登录的页面
let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"];
list.forEach(item => { //用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
uni.addInterceptor(item, {
invoke(e) { // 调用前拦截
// console.log(e);
//获取用户的token
const token = uni.getStorageSync('uni_id_token')
const token = uni.getStorageSync('uni_id_token'),
//token是否已失效
const tokenExpired = uni.getStorageSync('uni_id_token_expired') < Date.now()
//获取当前页面路径(即url去掉"?"和"?"后的参数)
const url = e.url.split('?')[0]
tokenExpired = uni.getStorageSync('uni_id_token_expired') < Date.now(),
//获取要跳转的页面路径(url去掉"?"和"?"后的参数)
url = e.url.split('?')[0],
//获取要前往的页面路径(即url去掉"?"和"?"后的参数)
pages = getCurrentPages(),
fromUrl = pages[pages.length - 1].route;
let inLoginPage = fromUrl.split('/')[2] == 'login-page'
//控制登录优先级
let pages = getCurrentPages();
if ( //判断当前窗口是否为登陆页面,如果是则不重定向路由
url == '/pages/ucenter/login-page/index/index'
&&
pages[pages.length - 1].route.split('/')[2]!='login-page'
url == '/pages/ucenter/login-page/index/index' &&
!inLoginPage
) {
console.log(9527777,login);
// console.log(9527777,login);
//一键登录(univerify)、账号(username)、验证码登录(短信smsCode)
if (login[0] == 'username') {
e.url = "/pages/ucenter/login-page/pwd-login/pwd-login"
}else{
if(e.url == url) { e.url += '?' } //添加参数之前判断是否带了`?`号如果没有就补上,因为当开发场景本身有参数的情况下是已经带了`?`号
e.url += "type="+login[0]
} else {
if (e.url == url) {
e.url += '?'
} //添加参数之前判断是否带了`?`号如果没有就补上,因为当开发场景本身有参数的情况下是已经带了`?`号
e.url += "type=" + login[0]
}
}else{
} else {
//拦截强制登录页面
if (needLogin.includes(url) && (token == ''||tokenExpired)) {
let pass = true
//pattern
if (needLogin) {
pass = needLogin.every((item) => {
if (item.slice(0, 8) == 'pattern:') {
return !eval(item.slice(8, item.length)).test(url)
}
return url != item
})
// console.log(pass)
}
if (visitor&&!inLoginPage) {
pass = visitor.some((item) => {
if (item.slice(0, 8) == 'pattern:') {
return eval(item.slice(8, item.length)).test(url)
}
return url == item
})
console.log(pass)
}
if (!pass && (token == '' || tokenExpired)) {
uni.showToast({
title: '请先登录',
icon: 'none'
......@@ -323,39 +366,40 @@ export default async function() {
return false
}
}
return e
},
fail(err) { // 失败回调拦截
console.log(err);
if(Debug){
if (Debug) {
console.log(err);
uni.showModal({
content: JSON.stringify(err),
showCancel: false
});
}
},
}
})
})
// #ifdef APP-PLUS
// 监听并提示设备网络状态变化
uni.onNetworkStatusChange(res=> {
// #ifdef APP-PLUS
// 监听并提示设备网络状态变化
uni.onNetworkStatusChange(res => {
console.log(res.isConnected);
console.log(res.networkType);
if(res.networkType!='none'){
if (res.networkType != 'none') {
uni.showToast({
title:'当前网络类型:'+res.networkType,
icon:'none',
duration:3000
title: '当前网络类型:' + res.networkType,
icon: 'none',
duration: 3000
})
}else{
} else {
uni.showToast({
title:'网络类型:'+res.networkType,
icon:'none',
duration:3000
title: '网络类型:' + res.networkType,
icon: 'none',
duration: 3000
})
}
});
// #endif
// #endif
}
/**
......
{
"name" : "uni-starter",
"appid" : "__UNI__03B096E",
"description" : "云端一体应用快速开发模版",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
"app-plus" : {
"privacy" : {
"prompt" : "template",
"template" : {
"title" : "服务协议和隐私政策",
"message" : "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"https://ask.dcloud.net.cn/protocol.html\">《服务协议》</a>和<a href=\"https://ask.dcloud.net.cn/protocol.html\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
"buttonAccept" : "同意",
"buttonRefuse" : "暂不同意"
"name": "uni-starter",
"appid": "请点击重新获取",
"description": "云端一体应用快速开发模版",
"versionName": "1.0.0",
"versionCode": "100",
"transformPx": false,
"app-plus": {
"privacy": {
"prompt": "template",
"template": {
"title": "服务协议和隐私政策",
"message": "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"https://ask.dcloud.net.cn/protocol.html\">《服务协议》</a>和<a href=\"https://ask.dcloud.net.cn/protocol.html\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
"buttonAccept": "同意",
"buttonRefuse": "暂不同意"
}
},
"compatible" : {
"ignoreVersion" : true
},
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
"modules" : {
"Fingerprint" : {},
"Share" : {},
"OAuth" : {},
"FaceID" : {},
"Push" : {}
},
"distribute" : {
"android" : {
"permissions" : [
"compatible": {
"ignoreVersion": true
},
"usingComponents": true,
"nvueStyleCompiler": "uni-app",
"compilerVersion": 3,
"splashscreen": {
"alwaysShowBeforeRender": true,
"waiting": true,
"autoclose": true,
"delay": 0
},
"modules": {
"Fingerprint": {
},
"Share": {
},
"OAuth": {
},
"FaceID": {
},
"Push": {
}
},
"distribute": {
"android": {
"permissions": [
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
......@@ -55,65 +60,78 @@
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
],
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ]
},
"ios" : {
"capabilities" : {
"entitlements" : {
"com.apple.developer.associated-domains" : [ "applinks:static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com" ]
"abiFilters": [
"armeabi-v7a",
"arm64-v8a",
"x86"
]
},
"ios": {
"capabilities": {
"entitlements": {
"com.apple.developer.associated-domains": [
"applinks:static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com"
]
}
}
},
"sdkConfigs" : {
"oauth" : {
"apple" : {},
"weixin" : {
"appid" : "wxffdd8fa6ec4ef2a0",
"appsecret" : "",
"UniversalLinks" : "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E"
},
"univerify" : {}
},
"ad" : {},
"share" : {
"weixin" : {
"appid" : "wxffdd8fa6ec4ef2a0",
"UniversalLinks" : "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E"
"sdkConfigs": {
"oauth": {
"apple": {
},
"weixin": {
"appid": "wxffdd8fa6ec4ef2a0",
"appsecret": "",
"UniversalLinks": "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E"
},
"univerify": {
}
},
"ad": {
},
"share": {
"weixin": {
"appid": "wxffdd8fa6ec4ef2a0",
"UniversalLinks": "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E"
}
},
"geolocation" : {},
"push" : {
"unipush" : {}
"geolocation": {
},
"payment" : {}
"push": {
"unipush": {
}
},
"nvueLaunchMode" : ""
"payment": {
}
}
},
"nvueLaunchMode": ""
},
"quickapp": {
},
"quickapp" : {},
"mp-weixin" : {
"appid" : "wx81dbb061d2258234",
"setting" : {
"urlCheck" : false,
"es6" : false
"mp-weixin": {
"appid": "",
"setting": {
"urlCheck": false,
"es6": false
},
"usingComponents" : true,
"betterScopedSlots" : true
"usingComponents": true,
"betterScopedSlots": true
},
"mp-alipay" : {
"usingComponents" : true
"mp-alipay": {
"usingComponents": true
},
"mp-baidu" : {
"usingComponents" : true
"mp-baidu": {
"usingComponents": true
},
"mp-toutiao" : {
"usingComponents" : true
"mp-toutiao": {
"usingComponents": true
},
"uniStatistics" : {
"enable" : false
"uniStatistics": {
"enable": false
},
"h5" : {
"template" : ""
"h5": {
"template": ""
},
"_spaceID" : "76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e"
"_spaceID": "76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e"
}
\ No newline at end of file
{
"id": "uni-starter",
"displayName": "uni-starter",
"version": "1.0.38",
"version": "1.0.39",
"description": "云端一体应用快速开发基本项目模版",
"keywords": [
"uni-starter",
......
<template>
<view class="warp">
<!-- 搜索 -->
<!-- #ifdef APP-PLUS -->
<status-bar />
<!-- #endif -->
<uni-search-bar ref="searchBar" style="flex:1;" radius="100" @click.native="searchClick" cancelButton="none" disabled />
<!-- banner -->
<unicloud-db ref="bannerdb" v-slot:default="{data, loading, error, options}" collection="opendb-banner"
field="_id,bannerfile,open_url,title" @load="load">
......@@ -67,13 +65,6 @@
icon: 'none'
})
},
searchClick() {
uni.hideKeyboard();
uni.navigateTo({
url: '/pages/list/search/search',
animationType: 'fade-in'
});
},
/**
* banner加载后触发的回调
*/
......@@ -121,8 +112,6 @@
</script>
<style>
@charset "UTF-8";
/* #ifndef APP-NVUE */
page {
display: flex;
......@@ -132,12 +121,10 @@
min-height: 100%;
height: auto;
}
view {
font-size: 14px;
line-height: inherit;
}
.example-body {
/* #ifndef APP-NVUE */
display: flex;
......@@ -149,14 +136,12 @@
font-size: 14px;
background-color: #ffffff;
}
/* #endif */
/* #ifdef APP-NVUE */
.warp {
background-color: #fff;
}
/* #endif */
.example-body {
......
......@@ -40,7 +40,6 @@ import uniShare from 'uni_modules/uni-share/js_sdk/uni-share.js';
};
},
created() {
console.log();
this.about = this.uniStarterConfig.about
uni.setNavigationBarTitle({
title:'关于'+this.about.appName
......
......@@ -87,7 +87,7 @@
},
{
validateFunction: function(rule, value, data, callback) {
console.log(value);
// console.log(value);
if (value != data.pwd) {
callback('两次输入密码不一致')
};
......
......@@ -19,19 +19,33 @@ module.exports = {
}
},
"router": {
//needLogin:配置强制需要登陆的页面,在打开这些页面之前会自动检查(前端校验)uni_id_token的值是否有效,如果无效会自动跳转到登陆页面
"needLogin": [
"/pages/ucenter/userinfo/userinfo",
"/uni_modules/uni-news-favorite/pages/uni-news-favorite/list",
"/uni_modules/uni-feedback/pages/uni-feedback/add"
/*
名词解释:“强制登陆页”
在打开定义的需强制登陆的页面之前会自动检查(前端校验)uni_id_token的值是否有效,
如果无效会自动跳转到登陆页面
两种模式:
1.needLogin:黑名单模式。枚举游客不可访问的页面。
2.visitor:白名单模式。枚举游客可访问的页面。
* 注意:黑名单与白名单模式二选一
*/
// "needLogin" : [
// "pattern:/^\\/pages\\/userinfo.*/", //支持正则表达式
// "/uni_modules/uni-news-favorite/pages/uni-news-favorite/list",
// "/uni_modules/uni-feedback/pages/uni-feedback/add"
// ],
"visitor" : [
"/",//注意入口页必须直接写 "/"
"pattern:/^\\/pages\\/list.*/", //支持正则表达式
"/pages/grid/grid",
"/pages/ucenter/ucenter",
"/pages/ucenter/about/about",
],
/*
login:配置登陆类型与优先级
未列举到的,或设备环境不支持的选项,将被隐藏。如果你需要在不同平台有不同的配置,直接用条件编译即可
根据数组的第0项,决定登录方式的第一优先级。
*/
// "login": ["username","smsCode","univerify", "weixin", "apple"],
"login": ["weixin","smsCode","univerify", "username", "apple"],
"login": ["weixin","username","univerify", "smsCode", "apple"]
},
//关于应用
"about": {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册