在ThinkPHP中,实现用户认证授权通常涉及以下几个步骤:
用户模型:首先,你需要有一个用户模型,用于与数据库中的用户表进行交互。
登录验证:创建一个控制器方法来处理用户的登录请求。在这个方法中,你需要验证用户提交的用户名和密码是否正确。
生成Token:一旦用户登录成功,你可以生成一个Token(例如JWT Token)来代表用户的会话。这个Token将被用于后续的请求中以验证用户身份。
中间件:创建一个中间件来检查每个请求中的Token,并验证它是否有效。如果Token无效或缺失,用户将被拒绝访问受保护的资源。
权限控制:根据用户的角色或权限来控制他们对不同资源的访问。这可以通过在控制器方法中添加权限检查逻辑来实现,或者使用更高级的权限管理库。
下面是一个简单的示例,展示了如何在ThinkPHP中实现这些步骤:
用户模型 (User.php)
namespace app\model;
use think\Model;
class User extends Model
{
// 用户模型可以包含一些方法,例如验证用户密码等
}
登录控制器 (LoginController.php)
namespace app\controller;
use think\Controller;
use app\model\User;
use think\Request;
use Firebase\JWT\JWT; // 假设使用Firebase JWT库
class LoginController extends Controller
{
public function login(Request $request)
{
$data = $request->param();
$user = User::where('username', $data['username'])->find();
if ($user && password_verify($data['password'], $user->password)) {
// 密码验证成功,生成Token
$token = JWT::encode([
'username' => $user->username,
'exp' => time() + 3600 // Token有效期1小时
], 'your_secret_key'); // 使用你的密钥
return json(['token' => $token]);
} else {
// 登录失败
return json(['error' => 'Invalid username or password'], 401);
}
}
}
Token验证中间件 (TokenAuthMiddleware.php)
namespace app\middleware;
use think\Request;
use Firebase\JWT\JWT;
class TokenAuthMiddleware
{
public function handle(Request $request)
{
$token = $request->header('Authorization');
if (!$token) {
return json(['error' => 'Token is missing'], 401);
}
try {
$decoded = JWT::decode($token, 'your_secret_key', ['HS256']);
$request->user = $decoded; // 将用户信息附加到请求对象上
} catch (\Exception $e) {
return json(['error' => 'Invalid token'], 401);
}
return $request->next(); // 继续处理请求
}
}
路由配置 (route.php)
use think\Route;
use app\controller\LoginController;
use app\middleware\TokenAuthMiddleware;
// 登录路由
Route::post('login', [LoginController::class, 'login']);
// 受保护的路由
Route::group(['middleware' => TokenAuthMiddleware::class], function () {
Route::get('protected', 'ProtectedController@index');
});
权限控制
在控制器方法中,你可以根据$request->user中的信息来检查用户的角色或权限,并据此决定是否允许访问。
请注意,这个示例使用了Firebase JWT库来生成和验证Token,你需要通过Composer来安装这个库:
composer require firebase/php-jwt
并且,你需要替换your_secret_key为你自己的密钥,用于签名和验证JWT Token。
这只是一个基本的实现示例,实际应用中可能需要更复杂的逻辑,例如刷新Token、权限分组、角色继承等。此外,ThinkPHP 5.1及以上版本提供了内置的认证和授权功能,可以通过配置和使用这些功能来简化实现过程。