二、创建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等)

