我怎么能说 Laravel 如果线程属于这个用户,允许他编辑或删除线程?

Posted

技术标签:

【中文标题】我怎么能说 Laravel 如果线程属于这个用户,允许他编辑或删除线程?【英文标题】:How do I can say Laravel that if the thread belongs to this user, allow him to edit or delete the thread? 【发布时间】:2016-06-09 18:58:57 【问题描述】:

嗯,我的标题几乎说明了我需要的一切。我正在为我建立一个小网站,只是为了学习 laravel 框架。我创建了一个登录/注册和一些功能来做一个线程或删除/编辑线程。我目前的问题是,登录的用户是否与编写线程的用户相同。只是用户登录的事实,允许他编辑或删除我网页上的每个线程。那当然不应该是这样......这就是为什么我喜欢这样说:如果登录的用户有一些线程,那么允许他删除或编辑他自己的线程。如果用户不是写线程的人,那么根本不要向他显示删除或编辑线程的选项。

现在这是我当前的 html - 或者更好的是它的片段:

   @if( Auth::check())
        <div class="panel-footer">
            !! Former::horizontal_open()->method('DELETE')->action(action("Test\\TestController@destroy", $thread->id))->id('conf') !!
            !! Former::danger_submit('Delete') !!
            !! Former::close() !!

            <a href=" URL::route('edit', $thread->id) ">
            <div class="btn btn-primary">Edit</div>
            </a>
        </div>
    @endif
    </div>
    <a href="#">
        <div class="btn pull-right"><a href=" action('Test\\TestController@index') ">Go back</a></div>
    </a>

所以这只是检查用户是否登录,如果没有,他看不到编辑/删除按钮。如果他已登录,他当然会看到它们。

现在我需要一个代码来说明他是否与编写线程的人相同,然后允许他编辑/删除它。

好吧,我真的不知道我该怎么做,我还没有真正找到适合这个的东西..

我有两个模型。一个用于所有线程,一个用于所有用户。

我在我的线程模型中做了一个 'belongsTo' 实现,并说它属于我的用户表中的名称属性。

线程模型:

<?php
namespace App\Models\Thread;

use Illuminate\Database\Eloquent\Model;

class Thread extends Model 
    public $table = 'thread';
    public $fillable = [
        'thread',
        'content',
    ];

    public function user() 
        return $this->belongsTo(User::class, "name");
    

用户模型:

<?php
namespace App\Models\Thread;

use Illuminate\Database\Eloquent\Model;

class User extends Model 
    public $table = 'users';
    public $fillable = [
        'name',
    ];

好吧..我被困住了,我希望有人可以帮助我。

感谢您的帮助和支持

我可以提供帮助的其他代码部分:

Route::get('/show/id', 'Test\\TestController@show');
Route::get('/show/id/edit', 'Test\\TestController@edit')->name('edit');
Route::put('/show/id/edit', ['as' => 'editing', 'uses' => 'Test\\TestController@update']);
Route::delete('/show/id', 'Test\\TestController@destroy')->name('destroy');

这就是我必须仅显示线程或删除/编辑线程的所有路线

控制器:即显示功能,它为我提供了带有按钮的视图:

  public function show($id)
    
        $thread = Thread::query()->findOrFail($id);
        return view('test.show', [
            'thread' => $thread,
        ]);
    

【问题讨论】:

看看这个laravel.com/docs/5.2/authorization#defining-abilities 好吧,我明白这一点并理解其中的大部分内容,但我更像是一个 laravel 初学者,所以无法想象我现在可以从哪里开始...... 【参考方案1】:

我认为做你想做的最好的方法是使用 Request 类。你只需要创建一个新的请求:

<?php
namespace App\Http\Requests;

 /** Remember to include here the classes you are using, 
  *  in your case it would be something like this:
  */
use App\Models\Thread;
use Auth;

class EditThreadRequest extends Request 
   /**
    * Determine if the user is authorized to make this request.
    *
    * @return bool
    */
    public function authorize()
    
      /**
        * You can get the thread id from your view
        * using for example a hidden input
        * !! Form::hidden('id', $thread->id) !!
        */
      $thread = Thread::findOrFail($this->get('id'));
      return $thread->user->id === Auth::user()->id;
    

   /**
    * Get the validation rules that apply to the request.
    *
    * @return array
    */
    public function rules()
    
      return [
         // Your validation rules
      ];
    

如果线程属于该用户,上述函数将返回true,允许用户继续请求。

在此之后,您只需像这样在您的编辑功能中包含新创建的请求,它会自动检查用户是否可以编辑线程:

public function edit (EditThreadRequest $request)

  // Your code

希望这会有所帮助!

【讨论】:

我只是在问我是否做对了。我会做一个请求文件(命名为例如 EditThreadRequest 并把你给我的代码放在那里。之后我将编辑我的编辑功能(和删除功能太正确):------------ - 公共函数编辑 (EditThreadRequest $request, $id ) ... (删除函数也一样)----对吗? 没错,您应该在每次必须创建/编辑某些内容时创建一个新请求:CreateThreadRequest、EditThreadRequest... 这样您就可以验证您的输入字段并授权/不授权该请求。您可以像这样通过命令行创建一个新请求:php artisan make:request EditThreadRequest. 我试过了,但它给了我一个:类 App\Http\Requests\Auth\EditThreadRequest 不存在——当然我做了一个:使用 App\Http\Requests\Auth\EditThreadRequest; 为什么在路径中包含 \Auth\?你的路径应该是使用 App\Http\Requests\EditThreadRequest; 因为我在 php 类文件之前做了一个 Auth 字典 -- 我会更改它并再试一次【参考方案2】:

你可以使用 Laravel 的 ability 系统。

或者在控制器中编辑线程时,您可以执行以下操作:

$thread = Thread::findOrFail($thread_id);

if (!Auth::check() &&
    $thread->user()->first()->id != Auth::user()->id) 
    abort(404); // Stop the user
 else 
    // Edit the threat

编辑您的编辑:

这对你有用吗?

public function show($id)

    $thread = Thread::findOrFail($id);

    if (!Auth::check() &&
        $thread->user()->first()->id != Auth::user()->id) 
        abort(404); // Stop the user
    

    return view('test.show', [
        'thread' => $thread,
    ]);

【讨论】:

我会试试你的代码 :) 我唯一不明白的是 ->first() 部分.. 这是为了什么?我真的很想使用 laravel 的能力系统,但我并不真正理解它:/ 我看到它,当然明白它意味着什么,但我不知道我从哪里开始等等...... @ItzMe488 你可以试试$thread-&gt;user-&gt;id,基本一样。 好吧.. 试过了,但是没有用.. 我想我做错了一些事情.. 我不知道我应该把代码放在哪里。我将使用我的显示功能更新我的问题。我的显示功能显示删除/编辑按钮所在的页面。因此,如果您单击一个线程(在我拥有的线程列表中),那么您将直接进入 show route -> show 函数,并且该函数将您定向到带有按钮等的 HTML ......我将更新我的对某些事情提出疑问,因为我真的不知道如何正确编写代码。 -- 顺便说一句,我对我的数据库做了一个 thread_id 属性。 我无法真正测试它,因为我得到一个:Class 'App\Http\Controllers\Test\Auth' not found 异常。 将此添加到文件顶部但在命名空间下:Use Auth;

以上是关于我怎么能说 Laravel 如果线程属于这个用户,允许他编辑或删除线程?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 获取不属于团队的用户

如果用户属于许多组织,则单独的角色/权限

用户在Laravel中更新密码后自动退出。我怎么防止这个?

如何保护您的 php api

Laravel 显示所有用户并检查是不是属于 Bans 表

Laravel 多对多关系属于用户