二、创建ThinkPHP项目
使用Composer创建新的ThinkPHP项目:
composer create-project topthink/think tp-auth
进入项目目录并启动内置服务器:
cd tp-auth php think run
三、数据库配置
创建MySQL数据库(例如:tp_auth)并在项目中进行配置:
// config/database.php return [ // 默认使用的数据库连接配置 'default' => 'mysql', // 数据库连接配置信息 'connections' => [ 'mysql' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'tp_auth', // 用户名 'username' => 'root', // 密码 'password' => 'your_password', // 端口 'hostport' => '3306', ], ], ];
四、创建用户数据表
使用ThinkPHP迁移功能创建用户表:
php think migrate:create CreateUsersTable
编辑迁移文件:
// database/migrations/2023xxxx_create_users_table.php use thinkmigrationMigrator; use thinkmigrationdbColumn; class CreateUsersTable extends Migrator { public function change() { $table = $this->table('users'); $table->addColumn('username', 'string', ['limit' => 50, 'comment' => '用户名']) ->addColumn('email', 'string', ['limit' => 100, 'comment' => '邮箱']) ->addColumn('password', 'string', ['limit' => 255, 'comment' => '密码']) ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) ->addIndex(['username', 'email'], ['unique' => true]) ->create(); } }
执行迁移:
php think migrate:run
五、创建用户模型
创建用户模型类并定义密码加密方法:
// app/model/User.php namespace appmodel; use thinkModel; class User extends Model { // 设置表名 protected $name = 'users'; // 自动写入时间戳 protected $autoWriteTimestamp = 'datetime'; // 密码加密方法 public function setPasswordAttr($value) { return password_hash($value, PASSWORD_DEFAULT); } // 验证密码 public function verifyPassword($password) { return password_verify($password, $this->password); } }
六、实现注册功能
1. 创建注册控制器
// app/controller/Register.php namespace appcontroller; use appmodelUser; use thinkfacadeView; use thinkRequest; class Register { public function index() { return View::fetch('register'); } public function save(Request $request) { // 获取表单数据 $data = $request->only(['username', 'email', 'password', 'password_confirm']); // 验证规则 $validate = new thinkValidate([ 'username|用户名' => 'require|min:3|max:50', 'email|邮箱' => 'require|email|unique:users,email', 'password|密码' => 'require|min:6|confirm', ]); // 验证数据 if (!$validate->check($data)) { return redirect('register')->with('error', $validate->getError()); } // 创建用户 $user = User::create([ 'username' => $data['username'], 'email' => $data['email'], 'password' => $data['password'] ]); if ($user) { // 注册成功,跳转到登录页 return redirect('login')->with('success', '注册成功,请登录'); } return redirect('register')->with('error', '注册失败,请重试'); } }
2. 创建注册视图
// view/register.html <form action="{:url('register/save')}" method="post"> <div class="form-group"> <label for="username">用户名</label> <input type="text" name="username" id="username" required> </div> <div class="form-group"> <label for="email">邮箱</label> <input type="email" name="email" id="email" required> </div> <div class="form-group"> <label for="password">密码</label> <input type="password" name="password" id="password" required> </div> <div class="form-group"> <label for="password_confirm">确认密码</label> <input type="password" name="password_confirm" id="password_confirm" required> </div> <button type="submit">注册</button> </form>
七、实现登录功能
1. 创建登录控制器
// app/controller/Login.php namespace appcontroller; use appmodelUser; use thinkfacadeSession; use thinkfacadeView; use thinkRequest; class Login { public function index() { return View::fetch('login'); } public function login(Request $request) { $data = $request->only(['email', 'password']); // 验证规则 $validate = new thinkValidate([ 'email|邮箱' => 'require|email', 'password|密码' => 'require|min:6', ]); if (!$validate->check($data)) { return redirect('login')->with('error', $validate->getError()); } // 查找用户 $user = User::where('email', $data['email'])->find(); if (!$user) { return redirect('login')->with('error', '邮箱或密码错误'); } // 验证密码 if (!$user->verifyPassword($data['password'])) { return redirect('login')->with('error', '邮箱或密码错误'); } // 登录成功,保存用户信息到session Session::set('user', [ 'id' => $user->id, 'username' => $user->username, 'email' => $user->email ]); return redirect('index/index')->with('success', '登录成功'); } public function logout() { // 清除session Session::delete('user'); return redirect('login')->with('success', '您已成功退出'); } }
2. 创建登录视图
// view/login.html <form action="{:url('login/login')}" method="post"> <div class="form-group"> <label for="email">邮箱</label> <input type="email" name="email" id="email" required> </div> <div class="form-group"> <label for="password">密码</label> <input type="password" name="password" id="password" required> </div> <button type="submit">登录</button> </form>
八、添加用户认证中间件
创建中间件用于验证用户是否登录:
// app/middleware/Auth.php namespace appmiddleware; use thinkfacadeSession; class Auth { public function handle($request, Closure $next) { // 检查用户是否登录 if (!Session::has('user')) { return redirect('login')->with('error', '请先登录'); } return $next($request); } }
注册中间件:
// app/middleware.php return [ // 全局中间件 appmiddlewareAuth::class => [ // 需要验证的路由 'index/index', 'user/profile', // 其他需要登录的页面 ] ];
九、安全性增强措施
为了提升系统安全性,我们添加以下功能:
- CSRF防护:在表单中添加CSRF令牌
- 登录尝试限制:防止暴力破解
- 密码强度要求:强制使用强密码
1. 添加CSRF防护
// 在config/middleware.php中启用CSRF中间件 return [ thinkmiddlewareSessionInit::class, thinkmiddlewareValidate::class, thinkmiddlewareCsrf::class => [ 'except' => ['login/login', 'register/save'] ] ];
2. 登录尝试限制
// 在Login控制器中增加限制逻辑 public function login(Request $request) { $email = $request->param('email'); $cacheKey = 'login_attempts_' . $email; // 检查登录尝试次数 $attempts = cache($cacheKey) ?: 0; if ($attempts >= 5) { return redirect('login')->with('error', '登录尝试次数过多,请10分钟后再试'); } // ... 原有登录逻辑 ... if (!$user || !$user->verifyPassword($password)) { // 增加尝试次数 cache($cacheKey, $attempts + 1, 600); // 10分钟缓存 return redirect('login')->with('error', '邮箱或密码错误'); } // 登录成功,清除尝试记录 cache($cacheKey, null); // ... 原有登录成功逻辑 ... }
十、最佳实践与总结
通过本教程,我们实现了以下功能:
- 完整的用户注册流程
- 安全的用户登录认证
- 基于Session的用户状态管理
- 用户认证中间件
- 安全性增强措施
项目结构总结:
tp-auth/ ├─ app/ │ ├─ controller/ │ │ ├─ Login.php │ │ ├─ Register.php │ ├─ model/ │ │ ├─ User.php │ ├─ middleware/ │ │ ├─ Auth.php ├─ config/ │ ├─ database.php │ ├─ middleware.php ├─ database/ │ ├─ migrations/ │ │ ├─ 2023xxxx_create_users_table.php ├─ view/ │ ├─ login.html │ ├─ register.html
进一步优化建议:
- 添加邮箱验证功能
- 实现密码重置功能
- 添加多因素认证
- 使用JWT实现API认证
- 集成第三方登录(微信、GitHub等)