【问题标题】:Laravel Policy and Show Method with View Method logical ProblemLaravel Policy 和 Show Method with View Method 逻辑问题
【发布时间】:2022-09-26 16:51:30
【问题描述】:

我正在使用政策并希望确保我不会向其他用户显示数据。 在每个表中,我都有列 \'user_id\' 并检查当前登录用户的 id 是否与数据和他的 user_id 相同。 在这种特定情况下,我有一个 Objects 和 Objektverwaltung 表,其中 objekt_id 作为外键给出。

我想使用我的策略来确保只有给定对象的数据显示在 objektverwaltung 中,其中给出了外键 \'objekt_id\'。

带有 show 方法的 ObjektVerwaltung 控制器:

public function show($objektvwId) {

        $objektId = ObjektVerwaltung::with(\'Objekt\')->find($objektvwId);

        
        
        $this->authorize(\'view\', $objektId);
        $objekte = ObjektVerwaltung::where(\'objekt_id\',$objektvwId)->get();
  
        
        
     
        return view(\'objekte.verwaltung\', compact(\'objekte\'));
    }

政策:

  public function view(User $user, ObjektVerwaltung $objektVerwaltung)
    {
        
        return $objektVerwaltung->user_id === $user->id;
    }

楷模:

class ObjektVerwaltung extends Model
{
    use HasFactory;

    protected $table = \'objekte_verwaltungens\';

    protected $fillable = [\'user_id\',\'objekt_id\',\'key\', \'value\'];

    public function Objekt() {
        return $this->belongsTo(Objekt::class);
    }
}

class Objekt extends Model
{

    use HasFactory;

    protected $table = \'objekts\';

    protected $fillable = [\'name\',\'strasse\', \'hausnummer\', \'plz\', \'ort\', \'user_id\'];


    public function Mieter() {
        return $this->hasMany(Mieter::class);
    }

    public function Company() {
        return $this->belongTo(Company::class);
    }

    public function Objektverwaltung() {
        return $this->hasMany(ObjektVerwaltung::class);
    }


}

我了解到我可以轻松地使用 find() 作为模型验证数据的方法。但在这种特定情况下,我必须检查 objekt_id(objektverwaltung 中的外键)而不是 ID,因此我不能使用 find()。但是,如果我使用 where 或其他方法,我将无法使用我的策略并且总是未经授权。

我尝试在模型上使用 with 方法,但也许有更好的方法来解决我的问题。我坚信。

谢谢!

这可能是解决方案,但我总是“未经授权”并且没有得到政策:$objekt= ObjektVerwaltung::where(\'objekt_id\', $objektId)->get(); $this->authorize(\'view\', $objekt);

  • 你能添加模型类吗?
  • 在我的文本中添加
  • 您的控制器令人困惑。这 $objektId = ObjektVerwaltung::with(\'Objekt\')->find($objektvwId); 返回 $objektVerwaltung ,但变量名为 $objektId $objekte = ObjektVerwaltung::where(\'objekt_id\',$objektvwId)->get(); 也一样。您正在使用objekt_id 获取ObjektVerwaltung,它不会返回任何内容。请先看看这些问题。我相信您的政策已得到正确执行。只是没有从数据库中正确获取数据。
  • 您好,变量 $objektvwId 是 ObjektVerwaltung 中列 objekt_id 的 ID。我不想 find() ObjektVerwaltung 中的 id。我想在 ObjektVerwaltung 中找到 objekt_id。我试图找到一个解决方案,如何通过该政策在这里解决它。检查 objekt_id 和 f.e. user_id 对数据是正确的
  • 这可能是解决方案,但我总是“未经授权”并且没有得到政策:$objekt= ObjektVerwaltung::where(\'objekt_id\', $objektId)->get(); $this->authorize(\'view\', $objekt);

标签: php laravel


【解决方案1】:

我解决了这个问题。我必须使用我的 ObjektPolicy,因为我使用的是 objekt_id 密钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多