Есть ли способ привратника laravel tinker?

Мне было интересно, можно ли расширить или заменить команду php artisan tinker, чтобы она сначала запрашивала аутентификацию как способ привратника, который может ее использовать.

Я пробовал следующее:

<?php

namespace App\Console\Commands;

use Laravel\Tinker\Console\TinkerCommand;
use Illuminate\Support\Facades\Auth;

class Tinker extends TinkerCommand
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'tinker';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $email      = $this->ask('Login (email)');
        $password   = $this->secret('Password for '.$email);

        if (!Auth::attempt(compact('email', 'password'))) {
            $this->error('Invalid Credentials.');
            return;
        }

        if (Auth::user()->cannot('use-tinker')) {
            $this->error('Unauthorized.');
            return;
        }

        parent::handle();
    }
}

Но я получаю сообщение об ошибке, потому что я не включил параметр «включить», используемый TinkerCommand@handle

    public function handle()
    {
        $this->getApplication()->setCatchExceptions(false);

        $config = new Configuration([
            'updateCheck' => 'never',
        ]);

        $config->getPresenter()->addCasters(
            $this->getCasters()
        );

        $shell = new Shell($config);
        $shell->addCommands($this->getCommands());
        $shell->setIncludes($this->argument('include')); # <-------- include argument

        if (isset($_ENV['COMPOSER_VENDOR_DIR'])) {
            $path = $_ENV['COMPOSER_VENDOR_DIR'];
        } else {
            $path = $this->getLaravel()->basePath().DIRECTORY_SEPARATOR.'vendor';
        }

        $path .= '/composer/autoload_classmap.php';

        $loader = ClassAliasAutoloader::register($shell, $path);

        try {
            $shell->run();
        } finally {
            $loader->unregister();
        }
    }

Я не уверен, что такое аргумент включения. Я попытался сбросить его, и это пустой массив. На данный момент мне интересно, есть ли лучший способ.


person IGP    schedule 21.08.2020    source источник


Ответы (1)


Если пользователь может запустить php artisan tinker, он также может:

  • Посмотрите исходный код вашего проекта. Он, вероятно, тоже может редактировать его, но это может быть не так с правильными правами доступа к файлам.

  • Посмотрите свой .env, содержащий учетные данные вашей базы данных и другую конфиденциальную информацию, такую ​​как ключи API.

Я не уверен, что на самом деле полезно ограничивать доступ внутри tinker для пользователя, у которого уже есть так много привилегий и возможностей. Он может отредактировать таблицу users вашей базы данных, чтобы предоставить доступ, например, пользователю, контролируемому им самим, или он может отредактировать исходный код, чтобы разрешить доступ.

Вот небольшая визуализация проблемы:

введите здесь описание изображения


Если вы все равно хотите это сделать, вместо расширения TinkerCommand я бы расширил базу Command, а затем запустил команду tinker после аутентификации.

public function handle() {
  
  // Do your own verification

  $this->runCommand(TinkerCommand::class, [], $this->output);
  return;
}
person gbalduzzi    schedule 24.08.2020
comment
Отличный визуал! ???? - person sykez; 25.08.2020