# 隐私政策和用户协议匿名访问配置说明
## 一、需求背景
根据法律法规和用户体验要求:
- 用户在注册/登录前应能查看《隐私政策》和《用户服务协议》
- 这两个页面需要支持**匿名访问**(无需登录)
- 用户可以充分了解协议内容后再决定是否注册
## 二、实现方案
### 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)
---
配置完成!现在用户可以在未登录状态下查看隐私政策和用户协议了。🎉