Paradox
4 سال پیش توسط Paradox مطرح شد
24 پاسخ

مسدود کردن کاربر

سلام وقت بخیر
من برای مسدود کردن کاربر از کد زیر استفاده کردم ومیخام وقتی وضعیت به غیرفعال تغییر کرد کاربر نتونه لاگین شه ولی موفق نمیشم

روت

Route::get('/users/status/{user}', 'User\UserController@updatestatus')->name('admin.users.status');

مدل

 protected $attributes = [
        'status' => 1 ,
    ];

کنترلر

   public function updatestatus(User $user)
    {
        if ($user->status == 1) {
            $user->status = 0;
        } else {
            $user->status = 1;
        }

        $user->save();
        return redirect(route('admin.users.index'));
    }

فایل بلید

           @foreach($users as $user)

                            @switch($user->status)
                            @case(1)
                            @php
                            $url = route('admin.users.status',$user->id);
                            $status = '<a href="'.$url.'" class="badge badge-success">فعال</a>' @endphp
                            @break
                            @case(0)
                            @php
                            $url = route('admin.users.status',$user->id);
                            $status = '<a href="'.$url.'" class="badge badge-warning">غیر فعال</a>' @endphp
                            @break
                            @default
                            @endswitch
                                    <td>{!!$status!!}</td>

ثبت پرسش جدید
حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

برای اینکه کاربر نتونه لاگین بشه باید قبل لاگین شدن وضعیت فعال یا غیر فعال بودن کاربرو برسی کنی و فقط به کاربرای با وضعیت فعال اجازه لاگین بدی. که شما در این کدهای قرار داده شده چنین چیزی رو چک نکردی. و این کدها هم ربطی به این موضوع نداره


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش آپدیت شد
0

داخل LoginController تریتی به صورت زیر است

use AuthenticatesUsers;

داخل این تریت متدی به صورت زیر است

    protected function authenticated(Request $request, $user)
    {
        //
    }

وقتی کاربر لاگین شد به این متد فرستاده میشه.
شما میتونی وضعیت کاربرو در این متد برسی کنی که اگه فعال بود کاری بهش نداشته باشی اما اگه غیر فعال بود همون جا سری logout تش کنی.
من این روش استفاده کردم روش دیگری هم هست اما این روش برام تمیزتربود
شما این متدودو باید در LoginController بازنویس کنید به این صورت

 protected function authenticated(Request $request, $user)
    {
        if ($user->status != 1) {
            Auth()->logout();
            return redirect('/');
        }
    }

البته میتونی شرطو به این صورت بنویسی

if (!$user->status) {
            Auth()->logout();
            return redirect('/');
        }

اول کاربر با هر وضعیتی لاگین میکنه بعد قبل اینکه بره وارد بخشش بشه به متد بالا فرستاده میشه اونجا میتونی وضعیتشو چک کنی و در صورت غیر فعال بودن سری لاگ اوتش کنی و بفرستیش به یه روت دلخواه که من منتقلش کردم صفحه خونه. همین جا هم میتونی یه پیام براش بنویسی و در صفحه خونه بهش نشون بدی.


بهزاد عزیزان
@behzad.azizan 4 سال پیش مطرح شد
2

سلام و وقت بخیر
به نظرم کدتون یه کمی کثیف نوشته شده
اما برای اینکه بخواید اجازه ورود به کاربر مسدود شده رو ندید باید یک میدلویر تعریف کنید که وظیفه ش اینه که فیلد status کاربر لاگین کرده رو بررسی کنه. در صورتی که این فیلد 0 بود باید کاربر رو لاگ‌اوت کنید و به صفحه لاگین هدایتش کنید یا خطای عدم امکان دسترسی بهش بدید


Paradox
تخصص : در حال یادگیری
@paradox 4 سال پیش مطرح شد
0

@hosseinshirinegad98
ممنون من این کدی که فرمودید اعمال کردم تو لاگین کنترلر فقط نمیدونم دیگه چه کاری انجام بدم که این کد اعمال بشه


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

کاری نمیخواد انجام بدین فقط باید تستش کنید با یه کاربر غیر فعال سعی کنید لاگین بشین.
معذرت میخوام فراموش کردم این دوتا کلاسو هم در لاگین کنترلر یوز کنید.

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

البته روش میدلور هم روش بسیار خوبی هست فقط همین روندو تو میدلور باید انجامش بدی.


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

ضمن اینکه میتونی متد updatestatus به صورت زیر بنویسی

    public function updatestatus(User $user)
    { 
        $user->status = ! $user->status;
        $user->save();

        return redirect(route('admin.users.index'));
    }

Paradox
تخصص : در حال یادگیری
@paradox 4 سال پیش مطرح شد
0

@hosseinshirinegad98
ممنونم از وقتی که گذاشتید ولی موفق نشدم به جواب برسم این کدها هم هیچ تغییری اعمال نکرد


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

قسمت بلیدو هم اینطوری تمیز بنویس

    @foreach($users as $user)
        <tr>
            <td>
                @if($user->status)
                    <span class="badge badge-success">فعال  </span>
                    <a href="route('admin.users.status', $user->id)" class="badge badge-warning">غیر فعال   </a>
                @else
                    <span class="badge badge-warning">غیر فعال   </span>
                    <a href="route('admin.users.status', $user->id)" class="badge badge-success">فعال</a>
                @endif
            </td>
        </tr>
    @endforeach

حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

من وقتم آزاده مشکلی نداره.
شما باید یه فیلد در جدول users با اسم status با نوع boolean داشته باشی که فقط مقادیر 0 و 1 رو قبول کنه.
و به این هم نیاز نیست.

 protected $attributes = [
        'status' => 1 ,
    ];

Paradox
تخصص : در حال یادگیری
@paradox 4 سال پیش مطرح شد
0

@hosseinshirinegad98

اومدم تو دیتابیس تغییری که فرمودید اعمال کنم
دستور
php artisan migate:fresh که زدم این ارور نمایش داد

C:\xampp\htdocs\laravelpro>php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.07 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.07 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)
Migrating: 2020_11_16_015844_create_active_code
Migrated:  2020_11_16_015844_create_active_code (0.16 seconds)
Migrating: 2020_11_19_204726_create_jobs_table
Migrated:  2020_11_19_204726_create_jobs_table (0.08 seconds)
Migrating: 2020_11_21_032928_create_attributes_table

   Illuminate\Database\QueryException

  SQLSTATE[HY000]: General error: 1005 Can't create table `laravelpro`.`attribute_product` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `attribute_product` add constraint `attribute_product_product_id_foreign` foreign key (`product_id`) references `products` (`id`) on delete cascade)

  at C:\xampp\htdocs\laravelpro\vendor\laravel\framework\src\Illuminate\Database\Connection.php:671
    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675|

  1   C:\xampp\htdocs\laravelpro\vendor\laravel\framework\src\Illuminate\Database\Connection.php:464
      PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table `laravelpro`.`attribute_product` (errno: 150 "Foreign key constraint is incorrectly formed")")

  2   C:\xampp\htdocs\laravelpro\vendor\laravel\framework\src\Illuminate\Database\Connection.php:464
      PDOStatement::execute()

علیرضا
@AliRezaa 4 سال پیش مطرح شد
0

سلام. اگر عین چیزی رو که میخواهید اعمال کنید در نظر بگیریم، یعنی "نتونه لاگین بشه" ، به نظرم بسادگی میتونید وقتی دارید status رو 0 میکنید یوزر رو از سایت logout کنید، از اونور هم موقع لاگین که رمز و پسورد چک میشه status هم چک بشه و اگر 0 بود اجازه ورود ندین و اگر خواستین در این حالت یک پیغام هم براش بذارید.

@hosseinshirinegad98
@behzad.azizan

انتقادات و نقائص احتمالی؟


بهزاد عزیزان
@behzad.azizan 4 سال پیش مطرح شد
2

@AliRezaa
سلام
آره میتونن این کارو بکنن و نقصی به نظرم نداره
اما چون یه سیاست مستقل هست و باید مستقلا چک بشه و همین طور ممکنه مثلا روت هایی رو داشته باشیم که نیازی به اعمالش نباشه (مثلا میتونه اینطوری باشه که کاربری که فعال نیست فقط بتونه به بخش آپلود مدارک دسترسی داشته باشه) برای این مورد گفتم به نظرم از طریق یه middleware چک بشه


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
1

موقع لاگین که رمز و پسورد چک میشه status هم چک بشه و اگر ۰ بود اجازه
ورود ندین و اگر خواستین در این حالت یک پیغام هم براش بذارید.

در لاراول 8 این کار سخت شده.
@AliRezaa


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

ترتیب اجرای مایگریشن ها اهمیت داده و برا اساس تاریخ ساختشون مایگریت میشن.
جدولی که داره به یه جدول دیگه کلید خارجی میده اون باید زودتر ایجاد بشه مایگریت بشه و گرنه ارور میده.
در این قسمت ابتدا باید جدول products قبل از جدول attribute_product مایگریت بشه. چون جدول products داره بهش کلید خارجی میده. برای اینکه جدول products قبل از جدول attribute_product مایگرت بشه. برید در نام جدول products تغییری ایجاد کنید مثلا دقت کنید اگر به تاریخ ساخت دو جدول در نامش دقت کنید میبینید که تاریخ ساخت جدول attribute_product زودتر از جدول products هست برای حل مسئله شما باید دستی تاریخ ساخت این دو جدول رو عوض کنید. تا جدول products زودتر درهنگام مایگرت , مایگریت بشه ایجاد بشه. یا تاریخ ساخت جدول products رو به قبل از تاریخ ساخت جدول attribute_product قرار بدین.

اشتباه این است که ابتدا جدول attribute_product رو ایجاد کردین
بازم عرض میکنم جدولی که قراره به یه جدول دیگه کلید خارجی بده اون باید زودتر از جدول دومی مایگریت بشه.


Paradox
تخصص : در حال یادگیری
@paradox 4 سال پیش مطرح شد
0

@hosseinshirinegad98
ممنون از شما ترتیبش و درست کردم الان برای جدول دیگه ای این مشکل به وجود اومده همه جداول رو از اول ساختم که تاریخش به ترتیب باشه ولی باز ارور دارم
از قبل بک اپ دیتابیس رو گرفتم
و مجبور شدم به صورت دستی تو دیتابی این مورد رو اعمال کنم

            $table->boolean('status')->default(0);

روت

Route::get('/auth/status/{user}', 'auth\LoginController@authenticated')->name('users.status');

لاگین کنترلر

    protected function authenticated(Request $request, $user)
    {
        // return $this->loggendin($request , $user);
        if ($user->status != 0) {
            Auth()->logout();
            return redirect('/');
        }
    }

و در بلید داخل foreach قرار دادم

                                            <td>
                                                @if($user->status)
                                                    <span class="badge badge-success">فعال  </span>
                                                    <a href="route('users.status', $user->id)" class="badge badge-warning">غیر فعال   </a>
                                                @else
                                                    <span class="badge badge-warning">غیر فعال   </span>
                                                    <a href="route('users.status', $user->id)" class="badge badge-success">فعال</a>
                                                @endif
                                            </td>

وقتی روی دکمه غیرفعال میزنم صفحه 404 نمایش میده

روت مشکل داره ؟یا جایی از کدها ؟


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

ببینید این کدی که من به شما دادم

   protected function authenticated(Request $request, $user)
    {
        // return $this->loggendin($request , $user);
        if ($user->status != 0) {
            Auth()->logout();
            return redirect('/');
        }
    }

این مربوط به قسمت لاگین شدن میشه و شما به اشتباه اومدی اون دکمه و روتتو به این متد و کنترلر وصل کردی که اشتباه صددرصدی است.
این کد بالا فقط زمانی که یه کاربر بخواد لاگین بشه اجرا میشه و فقط به کاربرانی که فعال باشن اجازه ورود به سایتو میده. اما دکمه های فعال و غیر فعال کردن که در بالا تعریف کردی به این صورت است که شما در پنل ادمین تشریف داری و میخوای با زدن این دکمه ها کاربرو مسدود کنی تا نتونه وارد سایتت بشه یا اونو از حالت مسدود شدن بیرون بیاری. این دوتا قضیه رو با هم قاطی نکن.
برای اینکه وضعیت کاربرو عوض کنی باید یه کنترلر فرضا با نام UserController بسازی و یه متد داخلش ایجاد کنی فرضا با نام changeStatus و اون روتتو به این متد وصل کنی و داخلش این کدو بنویسی.

    public function changeStatus (User $user)
    {
        $user->status = ! $user->status;
        $user->save();
        return redirect()->back();
    }

Paradox
تخصص : در حال یادگیری
@paradox 4 سال پیش مطرح شد
0

@hosseinshirinegad98
ممنونم
باز هم وقتی تو پنل ادمین روی غیرفعال یا فعال کلیک میکنم صفحه 404 میده
به این روت میره

http://localhost:8000/admin/route('admin.users.status',%20$user-%3Eid)

و از داخل دیتابیس وقتی غبرفعال میکنم کاربر همچنان میتونه لاگین بشه
برای این چیکار باید انجام بدم


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

واقعا عذر میخوام ما اینجا آکولادها رو فراموش کردیم بزاریم. برا ی چاپ هر چیز باید از آکولاد در بلید استفاده بشه.

<td>
    @if($user->status)
        <span class="badge badge-success">فعال  </span>
        <a href="{{route('users.status', $user->id)}}" class="badge badge-warning">غیر فعال   </a>
    @else
        <span class="badge badge-warning">غیر فعال   </span>
        <a href="{{route('users.status', $user->id)}}" class="badge badge-success">فعال</a>
    @endif
</td>

بعداین لاگینو یه کاریش میکنیم ابتدا اینو تستش کن.


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

ما اینجا نباید مقداری که برای فعال بودن کاربر در نظر گرفتیم با مقدار غیرفعال بودنش اشتباه گرفته بشه. حس میکنم در این

protected function authenticated(Request $request, $user)

متد شرطو اشتباه نوشتم. پس اگر مقدار فیلد status برابر با 1 بود یعنی کاربر فعال است و 0 هم غیرفعال . پس زمانی که status برابر با 0 است کاربر نیاید بتونه لاگین بکنه
این متدو به این صورت شرطشو عوض کنید.

  protected function authenticated(Request $request, $user)
    {
        // return $this->loggendin($request , $user);
        if ($user->status == 0) {
            Auth()->logout();
            return redirect('/');
        }
    }

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام