登录与入口
新用户注册/登录/绑定手机/认证流程全面分析报告
目标:回答你提出的 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.php 的 register() 里会:
password做md5()后入库(不是明文)。
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()-> scenebind_mobile_pc - 绑定:
ajaxBindMobile()
- 验证手机号格式
- 验证短信码
- 更新 users.mobile
- 发放积分/声望奖励(integral('mobile')、prestige('mobile'))
4.2 MemberAction 里的 mobile()(旧路径)
文件:Banyan/Lib/Action/User/MemberAction.class.php
- 也有
mobile()+sendsms()绑定逻辑 - 但页面 JS 已指向
info/sendsms与info/ajaxBindMobile,实际主用是 InfoAction 方案
4.3 “账号合并/绑定 connect”特殊逻辑
文件:Banyan/Lib/Action/User/InfoAction.class.php 的 account()
- 用手机验证码找到目标 user_id
- 再把
connect.open_id对应 uid 改绑到该 user_id - 最后登出
这是“第三方账号迁移到已有手机号账户”的合并逻辑。
五、“认证”相关流程(用户侧)
5.1 实名资料认证(Usersaux)
文件:Banyan/Lib/Action/User/UsersauxAction.class.php
index()提交实名资料:
- 身份证照片、姓名、手机、地址、担保人信息等
- 新增后状态进入后台审核流(具体审核在后台模块)
5.2 手机认证
- 绑定手机成功后,系统记为手机认证并发奖励(积分/声望)
六、你当前两个疑问的结论(简版)
- 员工登录只显示张翔
不是偶发问题,是代码 find() 只取一条员工关系导致。
- 微信自动注册后后台有密码、用户不知道
密码是系统随机生成并 MD5 入库,流程未通知用户,因此用户不知道。
七、风险与优化建议(建议尽快)
7.1 员工入口多身份支持
- 将
member/index的员工显示从find()改为select()列表; - 增加“员工身份切换(公司/部门)”入口;
- Worker 端 CommonAction 支持 session 指定当前员工关系,而非默认第一条。
7.2 微信自动注册的密码策略
- 建议改为“无本地密码”或“首次强制设置密码”;
- 至少在首次自动注册后引导绑定手机并设置密码;
- 禁止任何日志记录明文口令。
7.3 统一注册策略
- 明确线上采用“绑定模式”还是“自动注册模式”;
- 若采用自动注册,必须配套用户可找回凭证机制(短信或邮箱)。
7.4 安全审计
- 排查
User_log等表是否记录明文密码字段(代码中有写入pass的路径); - 如已落库,建议立即脱敏/清理并禁用该记录行为。
八、与本次问题直接相关的关键文件清单
themes/default/User/member/index.htmlBanyan/Lib/Action/User/MemberAction.class.phpBanyan/Lib/Action/Worker/CommonAction.class.phpBanyan/Lib/Action/Home/PassportAction.class.phpBanyan/Lib/Action/Wap/PassportAction.class.phpBanyan/Lib/Model/PassportModel.class.phpBanyan/Lib/Action/User/InfoAction.class.phpBanyan/Lib/Action/User/UsersauxAction.class.phpBanyan/Lib/Model/ConnectModel.class.php
