问题描述
我在 cakePHP 4 工作。我已经为登录身份验证设置了模型(“代表”),但它使用另一个带有用户名的模型进行身份验证。我已经上传了 AppController.PHP 文件以及 EmployeesController.PHP 文件,我在其中定义了方法(操作)。
在控制器/AppController.PHP
class AppController extends Controller
{
public function initialize(): void
{
parent::initialize();
$this->loadComponent('RequestHandler');
$this->loadComponent('Flash');
$this->loadComponent('Auth',[
"authenticate" => [
"Form" => [
"fields" => [
"username" => "email","password" => "password"
],"usermodel" => "Representatives"
]
],"loginAction" => [
"controller" => "Employees","action" => "login"
],"loginRedirect" => [
"controller" => "Employees","action" => "home"
],"logoutRedirect" => [
"controller" => "Employees","action" => "login"
]
]);
}
在员工控制器中:
class EmployeesController extends AppController
{
public function initialize(): void
{
parent::initialize();
$this->loadModel("Employees");
$this->loadModel("Representatives");
$this->loadComponent('Flash');
}
public function login()
{
if ($this->request->is('post')) {
$user = $this->Auth->identify();
// echo "<pre>"; print_r($user); die;
if ($user) {
$this->Auth->setUser($user);
echo "<pre>"; print_r($user); exit();
return $this->redirect($this->Auth->redirectUrl());
} else {
$this->Flash->error(__('Username or password is incorrect'));
}
}
$this->viewbuilder()->setLayout('home');
$this->set("title","Login");
}
在模型/实体/Representative.PHP
<?PHP
namespace App\Model\Entity;
use Authentication\PasswordHasher\DefaultPasswordHasher;
use Cake\ORM\Entity;
class Representative extends Entity
{
protected $_accessible = [
'id' => false,'name' => true,'role' => true,'email' => true,'password' => true,'phone' => true,'slug' => false
];
protected function _setPassword(string $password) : ?string
{
if (strlen($password) > 0) {
return (new DefaultPasswordHasher())->hash($password);
}
}
}
在模型/表/RepresentativesTable.PHP
<?PHP
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\Utility\Text;
use Cake\Event\EventInterface;
class RepresentativesTable extends Table
{
public function initialize(array $config) :void
{
$this->setTable("newusers");
}
public function beforeSave(EventInterface $event,$entity,$options)
{
if ($entity->isNew() && !$entity->slug) {
$sluggedTitle = Text ::slug($entity->name);
$entity->slug = substr($sluggedTitle,191);
}
}
}
解决方法
虽然视频翻译很糟糕。我能够按照视频中的示例进行操作,重要的部分是添加“解析器”以允许 cakephp 找到正确的表。
,'resolver' => [
'className' => 'Authentication.Orm','userModel' => 'YourUserTable'
],
这确实造成了 $this->Identiy->get 失败的另一个问题,我希望会添加一个解析器,使其也能按预期工作。
谢谢!!
,默认情况下,cakephp 使用用户模型进行身份验证
您可以在此 video
中找到使用其他路由的身份验证示例示例中定义如下:
public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
{
$authenticationService = new AuthenticationService([
'unauthenticatedRedirect' => '/cinema4/usuarios/login','queryParam' => 'redirect',]);
// Load identifiers,ensure we check email and password fields
$authenticationService->loadIdentifier('Authentication.Password',[
'fields' => [
'username' => 'login','password' => 'senha',],'userModel' => 'Usuarios'
],]);
// Load the authenticators,you want session first
$authenticationService->loadAuthenticator('Authentication.Session');
// Configure form data check to pick email and password
$authenticationService->loadAuthenticator('Authentication.Form','loginUrl' => '/cinema4/usuarios/login',]);
return $authenticationService;
}