remember_token是如何由laravel自动生成的?我们可以在 codeigniter 中做同样的事情吗?
How remember_token is generated by laravel automatically? Can we do the same in codeigniter?
我是 MVC 新手。谁能告诉我 remember_token 的函数写在 laravel 的什么地方?
我在 Bluprint 中看到并找到了这个函数:
public function rememberToken()
{
return $this->string('remember_token', 100)->nullable();
}
这只是一个在数据库中定义字段的函数。我也在 Contracts/Auth/Authenticable.php 中看到,但在这里我也发现了一堆接口以及 getremembertoken 和 setremembertoken 定义为:
interface Authenticatable
{
public function getRememberToken();
public function setRememberToken($value);
public function getRememberTokenName();
}
为生成保存在数据库中的令牌而编写的实际函数在哪里?谁能告诉我吗?我可以在codeigniter中实现类似的功能吗?
Yes you can do this in CodeIgniter Also
打开你的application/config/config.php
// Default $config['csrf_protection'] = FALSE; change and set TRUE
$config['csrf_protection'] = FALSE;
// Change it To
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_token'; // The token name
$config['csrf_cookie_name'] = 'csrf_cookie_name'; // The cookie name
$config['csrf_expire'] = 7200; // The number in seconds the token should expire.
$config['csrf_regenerate'] = FALSE; // Regenerate token on every submission
$config['csrf_exclude_uris'] = array(); // Array of URIs which ignore CSRF checks
您可以通过安全获取 CSRF 令牌名称和值 class:
$this->security->get_csrf_hash();
$this->security->get_csrf_token_name();
您可以在 system/core/Security.php
行 306, 319
中找到此函数
Laravel 中的记忆标记在需要时创建(例如,当用户注册并单击 "remember me" 按钮时。发生这种情况时,默认脚手架将调用 AuthenticatesUsers::attemptLogin
方法:
protected function attemptLogin(Request $request)
{
return $this->guard()->attempt(
$this->credentials($request), $request->has('remember')
);
}
默认的 guard 在 "attempt" 方法中接受 2 个参数(但是实际的 Guard 接口实际上根本不需要存在尝试方法,这只是默认的 Laravel 脚手架)。
示例 SessionGuard
有以下尝试方法:
public function attempt(array $credentials = [], $remember = false)
{
$this->fireAttemptEvent($credentials, $remember);
$this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);
if ($this->hasValidCredentials($user, $credentials)) {
$this->login($user, $remember);
return true;
}
$this->fireFailedEvent($user, $credentials);
return false;
}
依次调用 login
(同样不是 Guard 接口的一部分,只是 laravel 脚手架)。如果您继续遵循调用顺序,它可以归结为:
protected function cycleRememberToken(AuthenticatableContract $user)
{
$user->setRememberToken($token = Str::random(60));
$this->provider->updateRememberToken($user, $token);
}
其次是:
protected function queueRecallerCookie(AuthenticatableContract $user)
{
$this->getCookieJar()->queue($this->createRecaller(
$user->getAuthIdentifier().'|'.$user->getRememberToken()
));
}
大概是将记住的令牌存储在(可能是加密的)cookie 中,并在以后使用它自动登录用户。
只是要指出 Laravel 是开源的,只要您需要有关实现的详细信息,就可以自己完成查看源代码的整个过程。
我是 MVC 新手。谁能告诉我 remember_token 的函数写在 laravel 的什么地方? 我在 Bluprint 中看到并找到了这个函数:
public function rememberToken()
{
return $this->string('remember_token', 100)->nullable();
}
这只是一个在数据库中定义字段的函数。我也在 Contracts/Auth/Authenticable.php 中看到,但在这里我也发现了一堆接口以及 getremembertoken 和 setremembertoken 定义为:
interface Authenticatable
{
public function getRememberToken();
public function setRememberToken($value);
public function getRememberTokenName();
}
为生成保存在数据库中的令牌而编写的实际函数在哪里?谁能告诉我吗?我可以在codeigniter中实现类似的功能吗?
Yes you can do this in CodeIgniter Also
打开你的application/config/config.php
// Default $config['csrf_protection'] = FALSE; change and set TRUE
$config['csrf_protection'] = FALSE;
// Change it To
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_token'; // The token name
$config['csrf_cookie_name'] = 'csrf_cookie_name'; // The cookie name
$config['csrf_expire'] = 7200; // The number in seconds the token should expire.
$config['csrf_regenerate'] = FALSE; // Regenerate token on every submission
$config['csrf_exclude_uris'] = array(); // Array of URIs which ignore CSRF checks
您可以通过安全获取 CSRF 令牌名称和值 class:
$this->security->get_csrf_hash();
$this->security->get_csrf_token_name();
您可以在 system/core/Security.php
行 306, 319
Laravel 中的记忆标记在需要时创建(例如,当用户注册并单击 "remember me" 按钮时。发生这种情况时,默认脚手架将调用 AuthenticatesUsers::attemptLogin
方法:
protected function attemptLogin(Request $request)
{
return $this->guard()->attempt(
$this->credentials($request), $request->has('remember')
);
}
默认的 guard 在 "attempt" 方法中接受 2 个参数(但是实际的 Guard 接口实际上根本不需要存在尝试方法,这只是默认的 Laravel 脚手架)。
示例 SessionGuard
有以下尝试方法:
public function attempt(array $credentials = [], $remember = false)
{
$this->fireAttemptEvent($credentials, $remember);
$this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);
if ($this->hasValidCredentials($user, $credentials)) {
$this->login($user, $remember);
return true;
}
$this->fireFailedEvent($user, $credentials);
return false;
}
依次调用 login
(同样不是 Guard 接口的一部分,只是 laravel 脚手架)。如果您继续遵循调用顺序,它可以归结为:
protected function cycleRememberToken(AuthenticatableContract $user)
{
$user->setRememberToken($token = Str::random(60));
$this->provider->updateRememberToken($user, $token);
}
其次是:
protected function queueRecallerCookie(AuthenticatableContract $user)
{
$this->getCookieJar()->queue($this->createRecaller(
$user->getAuthIdentifier().'|'.$user->getRememberToken()
));
}
大概是将记住的令牌存储在(可能是加密的)cookie 中,并在以后使用它自动登录用户。
只是要指出 Laravel 是开源的,只要您需要有关实现的详细信息,就可以自己完成查看源代码的整个过程。