我试图允许用户使用电子邮件或用户名及其密码登录。
我在 FortifyServiceProvider.php 的 boot() 内添加了以下代码:
Fortify::authenticateUsing(function (Request $request) {
$user = User::where('email', $request->email)
->orWhere('username', $request->username)
->first();
if ($user &&
Hash::check($request->password, $user->password)) {
return $user;
}
});
Run Code Online (Sandbox Code Playgroud)
但现在,当用户尝试通过输入用户名而不是电子邮件登录时,他们会收到以下错误消息:
These credentials do not match our records.
Run Code Online (Sandbox Code Playgroud) php laravel laravel-authentication laravel-8 laravel-fortify
我在 Laravel 8 中很好地安装了 Laravel JetStream 和 Spatie 的 laravel-permission。
\n我可以在注册过程中为用户分配角色
\n$user->assignRole('visitor');\nreturn $user;\nRun Code Online (Sandbox Code Playgroud)\n并可以通过我在播种器 fil\xc3\xa9s run 方法中分配给角色的权限来限制用户仪表板上的可用菜单项:
\nPermission::create(['name' => 'access profile']);\nPermission::create(['name' => 'access logout']);\n\n$visitor = Role::create(['name' => 'visitor']);\n$visitor->givePermissionTo('access profile');\nRun Code Online (Sandbox Code Playgroud)\n并通过视图中的 can 指令,例如:
\n@can('access profile')\n<!-- Account Management -->\n<div class="block px-4 py-2 text-xs text-gray-400">\n {{ __('Manage Account') }}\n</div>\n\n<x-jet-dropdown-link href="{{ route('profile.show') }}">\n {{ __('Profile') }}\n</x-jet-dropdown-link>\n@endcan\nRun Code Online (Sandbox Code Playgroud)\n因此,我可以根据角色隐藏菜单项,但不幸的是,我仍然可以通过知道确切的 URL 直接访问该功能。
\n我想我必须编写一个中间件来限制对某些功能的访问,但具体怎么做呢?
\n在此堆栈中处理此问题的正确且可接受的方法是什么?
\n谢谢!\nArmand\n所以一切看起来都很好,但是(!)
\n如何禁止直接访问隐藏项目?我想在这种情况下,路由是由 sainttum 控制的,而角色和权限是由 Spatie 的包控制的。
\n是否可以将两者联系起来?
\n谢谢!
\nlaravel laravel-permission laravel-sanctum laravel-jetstream laravel-fortify
我的项目使用 laravel fortify,惯性与 vue。我必须添加基于角色的权限(就像 spatie 权限包一样)。我对于强化和惯性还是一个初学者。但我有 spatie 包的经验。我对如何添加角色和权限进行强化感到困惑。目前我计划创建像 spatie 包 has 这样的表结构(角色、权限、roles_has_permissions 等)。是否有每个构建包或更好的方法来实现角色和权限?并在 vue 文件中使用“@can”?谢谢。
大家好,这是我目前所做的(我现在正在使用这个)。它正在工作,但仍需要一些改进,(任何更好的解决方案我真的很感激)
1)照常安装和配置 spatie/laravel-permission
2)使用seeder向表添加预定义的权限和角色
在用户模型中创建函数来获取权限数组列表
// user model function
public function getPermissionArray()
{
return $this->getAllPermissions()->mapWithKeys(function($pr){
return [$pr['name'] => true];
});
}
Run Code Online (Sandbox Code Playgroud)
并将该功能添加到惯性中间件中
// user model function
public function getPermissionArray()
{
return $this->getAllPermissions()->mapWithKeys(function($pr){
return [$pr['name'] => true];
});
}
Run Code Online (Sandbox Code Playgroud)
现在$page.props.auth.can可以全球访问
<div class="row">
<div class="col-sm-12 col-md-6" v-if="$page.props.auth.can['user_create']">
<inertia-link
class="btn btn-primary"
:href="$route('admin.user.create')"
>Create New
</inertia-link>
</div>
</div>
Run Code Online (Sandbox Code Playgroud) 以下 PHP 代码用于捕获来自 Livewire 表单的输入。该表单更新用户的密码,对于眼尖的人来说,您可能会发现它的大部分内容取自 Laravel Fortify 框架。
/**
* Validate and update the user's password.
*
* @param mixed $user
* @param array $input
* @return void
*/
public function update($user, array $input)
{
try {
Validator::make($input, [
'current_password' => ['required', 'string'],
'password' => $this->passwordRules(),
])->after(function ($validator) use ($user, $input) {
if (! isset($input['current_password']) || ! Hash::check($input['current_password'], $user->password)) {
$validator->errors()->add('current_password', __('The provided password does not match your current password.'));
}
})->validateWithBag('updatePassword');
} catch (\Illuminate\Validation\ValidationException $e) {
dd ($e);
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 Laravel 中删除 Fortify 和 Jetstream 软件包,因此我从 App 中删除了它们。提供者,来自composer.json(需要部分)、操作、配置、供应商。然后我运行 Composer update 并收到以下消息:
脚本 @php artisan package:discover --ansi 处理返回的 post-autoload-dump 事件,错误代码为 1
我还从相同的位置移除了圣所
使用 Postman,我将以下字段发送到 URL,以便在数据库中注册用户http://mywebsite/register:
电子邮件
密码
确认密码
姓名
根据文档https://laravel.com/docs/8.x/fortify#registration(我从中找到了上述字段),Fortify已经定义了路线register,所以我不需要自己定义它。
根据文档,并且根据我的需要,我不需要创建注册表:我直接使用 Postman 将这些注册数据/register作为 XHR POST 请求数据发送到 Laravel Fortify 的路由。此外,我不需要 Fortify 返回视图,因此我禁用了它们(https://laravel.com/docs/8.x/fortify#disabling-views)。事实上,我只是等待 HTTP 代码响应,我将在 Postman 的返回数据中看到该响应(见下文)。
由于我已禁用视图并且由于我发送了 XHR POST 请求(在 Postman 中,我将随注册请求一起发送此 HTTP 标头:)X-Requested-With = XMLHttpRequest:
如果注册尝试成功,Fortify 会将用户重定向到通过应用程序的 fortify 配置文件中的 home 配置选项配置的 URI。如果登录请求是 XHR 请求,将返回 200 HTTP 响应。
如果请求不成功,用户将被重定向回注册屏幕,并且验证错误将通过共享的 $errors Blade 模板变量提供给您。或者,对于 XHR 请求,验证错误将通过 422 HTTP 响应返回。
(https://laravel.com/docs/8.x/fortify#registration)
它正确注册了用户。但我在 Postman 中看到的结果是Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException …
xmlhttprequest laravel postman laravel-authentication laravel-fortify
我希望能够从我的管理员帐户以其他用户身份登录。
我正在使用 Laravel fortify 使用 Inertia Js 制作 SPA 应用程序来处理会话和登录。
在 laravel 8 中,我能够以另一个用户身份登录,但在 laravel 9 中,登录方法使我注销。
$user = User::find(2);
Auth::guard('web')->login($user); // or // Auth::login($user);
Run Code Online (Sandbox Code Playgroud)
我检查了 csrf 令牌,尝试排除我的 uri,但没有任何变化。
如果您有任何想法,请不要犹豫,谢谢!
我目前正在记录用户的上次登录时间戳并将 ip 记录到用户表中。我在 laravel 7 的 auth 控制器登录功能中做到了这一点。像这样:
$user->last_login = Carbon::now()->toDateTimeString();
$user->last_login_ip = $request->getClientIp();
$user->save();
Run Code Online (Sandbox Code Playgroud)
但当前项目我使用 laravel fortify 包。我仍在学习这个包。记录用户登录时间戳和 ip 的最佳方法是什么??
谢谢
我有一个相对较新的 laravel 8 安装与 jetstream/fortify。我正在尝试使用预先存在的用户表,该表的表名与默认的“用户”不同。
通过阅读周围的内容,我认为我必须在 app\Model\User.php 中更新它。我所做的如下:
class User extends Authenticatable
14 {
15 /**
16 .* My custom users table
17 .*/
18 protected $table = "user"; // note here it is user not users
19 protected $primaryKey = "user_id";
Run Code Online (Sandbox Code Playgroud)
但是当我尝试注册新用户时,我收到 SQLSTATE 错误,指出未找到基表或视图......“mydb.users”不存在。
所以它仍然在寻找“用户”而不是“用户”。
我还需要在哪里更改此设置?
该文档似乎没有提到其他任何地方,其他堆栈答案似乎表明这应该足够了
编辑:这是我的 config/auth.php 部分
67
68 'providers' => [
69 . 'users' => [
70 . . 'driver' => 'eloquent',
71 . . 'model' => App\Models\User::class,
72 . ],
73
74 …Run Code Online (Sandbox Code Playgroud) 我正在使用 fortify 进行身份验证,但是我需要更改 fortify 自动发送的“重置密码”电子邮件模板中的文本。我找不到实现此目标的方法。
是否可以从 Nova 编辑模板?我在 Nova 中有一个 MailTemplate 资源,允许从 Nova 更改电子邮件模板,但我无法实现“重置密码电子邮件”,因为它是由 fortify 发送的,并且无法找到控制它的方法。