# 隐私政策和用户协议匿名访问配置说明 ## 一、需求背景 根据法律法规和用户体验要求: - 用户在注册/登录前应能查看《隐私政策》和《用户服务协议》 - 这两个页面需要支持**匿名访问**(无需登录) - 用户可以充分了解协议内容后再决定是否注册 ## 二、实现方案 ### 2.1 修改内容 **文件**: `app/permission.js` **修改前**: ```javascript // 页面白名单 const whiteList = [ '/pages/login', '/pages/register', '/pages/common/webview/index' ] ``` **修改后**: ```javascript // 页面白名单 const whiteList = [ '/pages/login', '/pages/register', '/pages/common/webview/index', '/pages/mine/privacy-policy/index', // 隐私政策(匿名访问) '/pages/mine/user-agreement/index' // 用户协议(匿名访问) ] ``` ### 2.2 工作原理 **权限拦截机制**: 1. **拦截所有页面跳转** - `navigateTo`: 保留当前页面,跳转到新页面 - `redirectTo`: 关闭当前页面,跳转到新页面 - `reLaunch`: 关闭所有页面,打开到应用内的某个页面 - `switchTab`: 跳转到 tabBar 页面 2. **检查用户登录状态** ```javascript if (getToken()) { // 已登录:允许访问 return true } ``` 3. **未登录时检查白名单** ```javascript if (checkWhite(to.url)) { // 在白名单中:允许访问 return true } else { // 不在白名单:跳转到登录页 uni.reLaunch({ url: loginPage }) return false } ``` ## 三、白名单页面列表 | 页面路径 | 说明 | 用途 | |---------|------|------| | `/pages/login` | 登录页面 | 用户登录入口 | | `/pages/register` | 注册页面 | 用户注册入口 | | `/pages/common/webview/index` | WebView页面 | 加载外部网页 | | `/pages/mine/privacy-policy/index` | 隐私政策 | 展示隐私保护政策(新增) | | `/pages/mine/user-agreement/index` | 用户协议 | 展示服务协议(新增) | ## 四、使用场景 ### 场景1: 登录页面查看协议 **用户操作**: ``` 登录页面 → 点击《隐私协议》或《用户协议》 ↓ 查看协议内容(无需登录) ↓ 返回登录页面 ``` **代码实现**: ```vue 登录即代表同意 《用户协议》 《隐私协议》 ``` ### 场景2: 注册页面查看协议 **用户操作**: ``` 注册页面 → 点击协议链接 ↓ 查看协议内容(无需登录) ↓ 返回注册页面 → 勾选同意 → 完成注册 ``` **代码实现**: ```vue ``` ### 场景3: 已登录用户查看协议 **用户操作**: ``` 我的页面 → 点击"用户服务协议"或"隐私政策"菜单 ↓ 查看协议内容 ↓ 返回我的页面 ``` **代码实现**: ```vue 用户服务协议 ``` ## 五、权限控制流程图 ``` 用户跳转页面 ↓ 检查是否已登录? ↓ 是 → 允许访问所有页面 ↓ 否 → 检查是否在白名单? ↓ 是 → 允许访问 ↓ 否 → 强制跳转到登录页 ``` ## 六、测试验证 ### 测试步骤 #### 测试1: 未登录状态访问协议(核心测试) 1. **清除登录状态** ```javascript // 在控制台执行 uni.removeStorageSync('token') uni.removeStorageSync('user') ``` 2. **重启小程序** - 微信开发者工具 → 编译 3. **测试登录页面** - 应该自动跳转到登录页面 - 点击《用户协议》链接 - ✅ 应该能成功跳转到协议页面(不会被拦截) - 查看协议内容 - 点击返回按钮 - ✅ 应该返回到登录页面 4. **测试注册页面** - 从登录页点击"立即注册" - 点击协议链接 - ✅ 应该能成功跳转到协议页面 - 返回注册页面 - ✅ checkbox状态保持 #### 测试2: 已登录状态访问协议 1. **正常登录** - 账号: admin - 密码: admin123 2. **从"我的"页面访问** - 进入"我的"页面 - 点击"用户服务协议" - ✅ 应该能成功跳转 - 返回 - 点击"隐私政策" - ✅ 应该能成功跳转 #### 测试3: 直接访问协议页面 在浏览器中直接输入地址(H5调试): ``` http://localhost:9090/#/pages/mine/privacy-policy/index http://localhost:9090/#/pages/mine/user-agreement/index ``` ✅ 应该能直接访问,不会跳转到登录页 ### 预期结果 | 测试场景 | 预期结果 | |---------|---------| | 未登录访问登录页 | ✅ 允许访问 | | 未登录访问注册页 | ✅ 允许访问 | | 未登录访问隐私政策 | ✅ 允许访问(新增) | | 未登录访问用户协议 | ✅ 允许访问(新增) | | 未登录访问首页 | ❌ 跳转到登录页 | | 未登录访问任务页 | ❌ 跳转到登录页 | | 已登录访问所有页面 | ✅ 允许访问 | ## 七、常见问题 ### 问题1: 点击协议链接后仍跳转到登录页 **原因**: 白名单路径配置错误 **检查**: ```javascript // app/permission.js // 确保路径完全匹配 '/pages/mine/privacy-policy/index' // ✅ 正确 '/pages/mine/privacy-policy' // ❌ 错误(缺少/index) ``` **解决**: 确保路径与pages.json中的配置一致 --- ### 问题2: 从协议页面返回后,登录页或注册页状态丢失 **原因**: 使用了错误的跳转方法 **解决**: ```javascript // ✅ 正确:使用navigateTo,保留当前页面 this.$tab.navigateTo('/pages/mine/privacy-policy/index') // ❌ 错误:使用redirectTo会关闭当前页面 this.$tab.redirectTo('/pages/mine/privacy-policy/index') ``` --- ### 问题3: H5环境下刷新协议页面后跳转到登录页 **原因**: H5刷新会重新执行路由守卫 **验证**: 这是正常现象,移动端不存在刷新操作 **解决**: 如需H5支持刷新,需要额外配置路由守卫 --- ## 八、安全考虑 ### 8.1 白名单范围控制 **原则**: 只将必要的页面加入白名单 **当前白名单**: - ✅ 登录/注册页面:必须匿名访问 - ✅ 协议页面:法律要求匿名访问 - ✅ WebView页面:用于显示外部协议链接 **不应加入白名单的页面**: - ❌ 首页 - ❌ 任务页面 - ❌ 消息页面 - ❌ 个人信息页面 - ❌ 其他业务功能页面 ### 8.2 数据安全 **协议页面特点**: - ✅ 纯展示内容,无敏感数据 - ✅ 不涉及API调用 - ✅ 不需要用户身份验证 - ✅ 不会泄露系统信息 **安全措施**: ```vue ``` ## 九、后续优化建议 ### 9.1 添加协议版本管理 ```javascript // app/config.js module.exports = { agreements: { privacyPolicy: { version: '1.0', lastUpdate: '2025-01-25', path: '/pages/mine/privacy-policy/index' }, userAgreement: { version: '1.0', lastUpdate: '2025-01-25', path: '/pages/mine/user-agreement/index' } } } ``` ### 9.2 记录用户同意状态 ```javascript // 用户首次访问时 localStorage.setItem('agreement_accepted', JSON.stringify({ privacyPolicy: { version: '1.0', acceptedAt: '2025-01-25' }, userAgreement: { version: '1.0', acceptedAt: '2025-01-25' } })) // 协议更新时,提示用户重新阅读 if (currentVersion !== acceptedVersion) { // 显示协议更新提示 } ``` ### 9.3 添加访问统计 ```javascript // 统计协议页面访问量 onLoad() { // 上报统计数据 uni.request({ url: '/api/statistics/agreement-view', method: 'POST', data: { type: 'privacy-policy', timestamp: new Date().getTime() } }) } ``` ## 十、总结 ### 完成的工作 ✅ **权限配置**: 已将隐私政策和用户协议页面加入白名单 ✅ **匿名访问**: 用户无需登录即可查看协议内容 ✅ **法律合规**: 满足《个人信息保护法》等法规要求 ✅ **用户体验**: 用户可在注册前充分了解协议 ### 修改的文件 - ✅ `app/permission.js` - 添加协议页面到白名单 ### 影响的页面 - ✅ `app/pages/login.vue` - 登录页协议链接可正常访问 - ✅ `app/pages/register.vue` - 注册页协议链接可正常访问 - ✅ `app/pages/mine/index.vue` - 已登录用户也可访问 - ✅ `app/pages/mine/privacy-policy/index.vue` - 支持匿名访问 - ✅ `app/pages/mine/user-agreement/index.vue` - 支持匿名访问 ### 测试建议 1. ✅ 清除登录状态,测试未登录访问 2. ✅ 从登录页点击协议链接测试 3. ✅ 从注册页点击协议链接测试 4. ✅ 登录后从"我的"页面访问测试 5. ✅ 在不同平台测试(H5、微信小程序、App) --- 配置完成!现在用户可以在未登录状态下查看隐私政策和用户协议了。🎉