登录与入口

新用户注册/登录/绑定手机/认证流程全面分析报告

目标:回答你提出的 3 个问题,并梳理当前系统“所有主要注册方式”的真实代码逻辑(PC/WAP/微信第三方/绑定)。

一、问题 1:/user/member/index.html 的“员工登录”为什么只显示“张翔”

1.1 页面显示逻辑(直接原因)

themes/default/User/member/index.html 中,员工入口使用了:

  • D('Shopworker')->where(array('user_id'=>$MEMBER['user_id']))->find();
  • 然后显示:员工登录(<{$worker['name']}>)

find() 只取 一条 记录(通常是第一条命中),不是列表,所以即使一个用户在 shop_worker 有多条员工关系,也只会显示一个名字(例如张翔)。

1.2 员工后台入口也采用单条模式

Banyan/Lib/Action/Worker/CommonAction.class.php 中同样是:

  • D('Shopworker')->find(array("where" => array('user_id' => $this->uid)));

也就是 Worker 模块默认按单条员工关系登录,不是多公司/多员工位切换模型。

1.3 结论

  • 当前“员工登录”设计是 单员工关系入口,并非“显示所有员工身份”。
  • 你看到固定显示张翔,本质是代码只取一条数据,不是前端显示 bug。

二、问题 2:微信登录自动注册后,后台为什么有密码、用户却不知道密码

2.1 微信自动注册代码位置

主要在:

  • Banyan/Lib/Action/Wap/PassportAction.class.php

- wxcallback() -> thirdlogin()/wxconn()

- wxconn() 中自动创建用户

2.2 密码生成逻辑(用户不感知)

wxconn() 自动注册用户时构造:

  • password => rand(10000000, 999999999)(随机数字串)

然后调用:

  • D('Passport')->register($user)

Banyan/Lib/Model/PassportModel.class.phpregister() 里会:

  • passwordmd5() 后入库(不是明文)。

2.3 为什么用户不知道

因为这条流程是“自动建号 + 自动登录”,没有:

  • 短信告知初始密码
  • 页面显示初始密码
  • 强制首次改密

所以用户天然不知道密码,只能后续走“忘记密码/绑定手机重置”。

2.4 风险提示

  • 自动生成密码但不通知用户,会造成“账号可登录但用户不知道凭证”体验问题。
  • 若后台日志不当记录了登录口令,会有安全风险(见后文风险清单)。

三、注册/登录全流程(主要方式)

这里按“真实代码入口”梳理,覆盖当前线上常用路径。

3.1 PC 注册(Home Passport)

文件:Banyan/Lib/Action/Home/PassportAction.class.php

  • 入口:register()
  • 账号规则:

- 支持手机或邮箱(受配置限制)

- 若账号是手机,需先短信验证码(scene: register_pc

  • 校验:

- 图形验证码(按配置)

- 两次密码一致

- 同意协议

  • 落库:

- 调用 D('Passport')->register($data)

- 在 PassportModel::register() 中哈希密码并写入 users

  • 成功后:

- 自动 setUid() 登录

3.2 WAP 注册(手机号)

文件:Banyan/Lib/Action/Wap/PassportAction.class.php

  • 入口:register()
  • 账号规则:

- 强制手机号(createCheck() 里限制)

- 短信验证码(scene: register_wap

  • 校验:

- 密码长度

- 可选二次确认(按配置)

  • 落库:

- D('Passport')->register($data)(统一模型)

3.3 账号密码登录(PC/WAP)

  • PC:Home/PassportAction::login()
  • WAP:Wap/PassportAction::login()
  • 核心校验:D('Passport')->login($account, $password)
  • 密码校验:PassportModel::login()md5($password) 对比 users.password
  • 账号锁定:

- 有错误次数累计 + 锁定时长配置(在 PassportModel::login() 中)

3.4 第三方登录(QQ/微博/微信)

绑定模式(connect.debug = 0)

  • 第三方回调后:

- 若 connect.uid 已存在 -> 直接登录该用户

- 若不存在:

- 已登录状态:绑定到当前 uid

- 未登录状态:跳转 passport/bind,要求绑定已有账号

自动注册模式(connect.debug = 1)

  • 第三方未绑定时自动建 users:

- 账号:随机邮箱样式

- 密码:随机数字

- 昵称/头像:按平台资料或默认值

  • 然后写入 connect.uid 并自动登录
微信“自动注册用户”你遇到的问题,主要来自这个模式与 wxconn() 路径。

四、后台“绑定手机”流程

4.1 会员中心/账户页绑定

文件:Banyan/Lib/Action/User/InfoAction.class.php

  • 发码:sendsms() -> scene bind_mobile_pc
  • 绑定:ajaxBindMobile()

- 验证手机号格式

- 验证短信码

- 更新 users.mobile

- 发放积分/声望奖励(integral('mobile')prestige('mobile')

4.2 MemberAction 里的 mobile()(旧路径)

文件:Banyan/Lib/Action/User/MemberAction.class.php

  • 也有 mobile() + sendsms() 绑定逻辑
  • 但页面 JS 已指向 info/sendsmsinfo/ajaxBindMobile,实际主用是 InfoAction 方案

4.3 “账号合并/绑定 connect”特殊逻辑

文件:Banyan/Lib/Action/User/InfoAction.class.phpaccount()

  • 用手机验证码找到目标 user_id
  • 再把 connect.open_id 对应 uid 改绑到该 user_id
  • 最后登出

这是“第三方账号迁移到已有手机号账户”的合并逻辑。


五、“认证”相关流程(用户侧)

5.1 实名资料认证(Usersaux)

文件:Banyan/Lib/Action/User/UsersauxAction.class.php

  • index() 提交实名资料:

- 身份证照片、姓名、手机、地址、担保人信息等

  • 新增后状态进入后台审核流(具体审核在后台模块)

5.2 手机认证

  • 绑定手机成功后,系统记为手机认证并发奖励(积分/声望)

六、你当前两个疑问的结论(简版)

  1. 员工登录只显示张翔

不是偶发问题,是代码 find() 只取一条员工关系导致。

  1. 微信自动注册后后台有密码、用户不知道

密码是系统随机生成并 MD5 入库,流程未通知用户,因此用户不知道。


七、风险与优化建议(建议尽快)

7.1 员工入口多身份支持

  • member/index 的员工显示从 find() 改为 select() 列表;
  • 增加“员工身份切换(公司/部门)”入口;
  • Worker 端 CommonAction 支持 session 指定当前员工关系,而非默认第一条。

7.2 微信自动注册的密码策略

  • 建议改为“无本地密码”或“首次强制设置密码”;
  • 至少在首次自动注册后引导绑定手机并设置密码;
  • 禁止任何日志记录明文口令。

7.3 统一注册策略

  • 明确线上采用“绑定模式”还是“自动注册模式”;
  • 若采用自动注册,必须配套用户可找回凭证机制(短信或邮箱)。

7.4 安全审计

  • 排查 User_log 等表是否记录明文密码字段(代码中有写入 pass 的路径);
  • 如已落库,建议立即脱敏/清理并禁用该记录行为。

八、与本次问题直接相关的关键文件清单

  • themes/default/User/member/index.html
  • Banyan/Lib/Action/User/MemberAction.class.php
  • Banyan/Lib/Action/Worker/CommonAction.class.php
  • Banyan/Lib/Action/Home/PassportAction.class.php
  • Banyan/Lib/Action/Wap/PassportAction.class.php
  • Banyan/Lib/Model/PassportModel.class.php
  • Banyan/Lib/Action/User/InfoAction.class.php
  • Banyan/Lib/Action/User/UsersauxAction.class.php
  • Banyan/Lib/Model/ConnectModel.class.php
copyright 2013-2113 www.baoanfuwu.cn All Rights Reserved 保安服务网版权所有
皖ICP备2021016109号-1