Tymon\JWTAuth\Contracts\JWTSubject
是一个接口,定义了用户模型需要实现的方法,以便与 tymon/jwt-auth
包协作。
1. 接口定义
namespace Tymon\JWTAuth\Contracts;
interface JWTSubject
{
/**
* Get the identifier that will be stored in the subject claim of the JWT.
*
* @return mixed
*/
public function getJWTIdentifier();
/**
* Return a key value array, containing any custom claims to be added to the JWT.
*
* @return array
*/
public function getJWTCustomClaims();
}
2. 逐行解读
(1) 命名空间
namespace Tymon\JWTAuth\Contracts;
-
作用:
- 定义了该接口所属的命名空间。
Tymon\JWTAuth\Contracts
是tymon/jwt-auth
包中的契约(Contracts)部分,用于定义核心行为规范。
-
解读:
- 命名空间帮助组织代码结构,并避免命名冲突。
- 这里的
Contracts
表示这是一个接口定义文件,专注于行为规范。
(2) 接口声明
interface JWTSubject
-
作用:
- 定义了一个接口,表示用户模型需要实现这些方法才能与 JWT 功能协作。
-
解读:
- 接口是一种约束机制,确保实现类必须提供特定的方法。
- 在这里,
JWTSubject
规定了用户模型如何与 JWT 相关功能交互。
(3) 方法:getJWTIdentifier()
public function getJWTIdentifier();
-
作用:
- 返回一个唯一标识符,该标识符将存储在 JWT 的
sub
(Subject)声明中。 - 通常,这个标识符是用户的主键(如
id
)。
- 返回一个唯一标识符,该标识符将存储在 JWT 的
-
解读:
- JWT 的
sub
声明用于标识 Token 的主体(通常是用户)。 - 实现该方法时,开发者需要返回一个唯一值,例如:
public function getJWTIdentifier() { return $this->getKey(); // 返回用户的主键 }
- 这个方法的核心目的是让 JWT 能够识别用户。
- JWT 的
(4) 方法:getJWTCustomClaims()
public function getJWTCustomClaims();
-
作用:
- 返回一个键值对数组,包含需要添加到 JWT 的自定义声明。
- 自定义声明可以用来传递额外信息,例如用户角色、权限等。
-
解读:
- JWT 的 Payload 部分可以包含标准声明(如
sub
、iat
、exp
)和自定义声明。 - 通过实现该方法,开发者可以向 JWT 中添加额外的信息。例如:
public function getJWTCustomClaims() { return [ 'role' => $this->role, // 用户角色 'email' => $this->email, // 用户邮箱 ]; }
- 这个方法的核心目的是扩展 JWT 的功能,使其能够携带更多业务相关的信息。
- JWT 的 Payload 部分可以包含标准声明(如
3. 整体解读
(1) 核心功能
-
JWTSubject
接口定义了两个方法,分别用于:- 提供 JWT 的主体标识符(
sub
声明)。 - 添加自定义声明到 JWT 的 Payload 中。
- 提供 JWT 的主体标识符(
-
作用:
- 确保用户模型能够与 JWT 功能无缝协作。
- 提供灵活性,允许开发者根据业务需求扩展 JWT 的内容。
(2) 使用场景
- 身份验证:
- 当用户登录时,
tymon/jwt-auth
会调用getJWTIdentifier()
方法获取用户的唯一标识符,并将其存储在 JWT 的sub
声明中。
- 当用户登录时,
- 授权管理:
- 开发者可以通过
getJWTCustomClaims()
方法向 JWT 中添加角色或权限信息,用于后续的权限校验。
- 开发者可以通过
(3) 示例实现
以下是一个完整的用户模型实现示例:
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
/**
* Get the identifier that will be stored in the subject claim of the JWT.
*
* @return mixed
*/
public function getJWTIdentifier()
{
return $this->getKey(); // 返回用户的主键
}
/**
* Return a key value array, containing any custom claims to be added to the JWT.
*
* @return array
*/
public function getJWTCustomClaims()
{
return [
'role' => $this->role, // 用户角色
'email' => $this->email, // 用户邮箱
];
}
}
- 解读:
getJWTIdentifier()
返回用户的主键,作为 JWT 的主体标识符。getJWTCustomClaims()
返回自定义声明,例如用户的角色和邮箱。- 这种实现方式使得 JWT 不仅能识别用户,还能携带额外的业务信息。
4. 总结
(1) 包含的部分
getJWTIdentifier()
:- 获取 JWT 的主体标识符(通常是用户主键)。
getJWTCustomClaims()
:- 获取自定义声明,用于扩展 JWT 的 Payload。
(2) 设计目的
- 提供一个标准化的方式,让用户模型与 JWT 功能协作。
- 通过接口定义,确保实现类具备必要的方法。
(3) 实际应用
- 在用户登录时生成 JWT。
- 在请求中解析 JWT 并提取用户信息和自定义声明。
通过以上解读,可以看出 JWTSubject
是一个简单但功能强大的接口,它为 JWT 的生成和解析提供了基础支持,同时允许开发者灵活扩展其功能。