代码之家  ›  专栏  ›  技术社区  ›  Razvan Zamfir

如何在这个Laravel 8应用程序中为被禁止的用户添加自定义验证消息?

  •  0
  • Razvan Zamfir  · 技术社区  · 2 年前

    我正在做一个 博客在Laravel 8中的应用

    4个用户角色 ,其中,“超级管理员”。超级管理员可以 禁止所有非超级管理员的用户

    enter image description here

    禁止的情况如下:

    users 桌子,有一个 active 类型的列 锡锡锡锡合金

    用户权限控制器 控制器我有一个小功能,可以禁止:

    public function ban_user($id){
          User::find($id)->update(['active' => 0]);
          return redirect()->back()->with('success', 'The user is now banned');
    }
    

    一旦用户被禁止,她/他将被 无法登录 。我通过去 vendor\laravel\ui\auth-backend\AuthenticatesUsers.php 并对此进行更改:

    protected function credentials(Request $request)
    {
        return $request->only($this->username(), 'password');
    }
    
    to
    
    protected function credentials(Request $request)
    {
        return array_merge($request->only($this->username(), 'password'), ['active' => 1]);
    }
    

    问题是:

    被禁止用户的任何登录尝试都会失败,但错误消息仍然是默认消息:

    这些凭据与我们的记录不匹配。

    enter image description here

    登录表单(视图):

    <form method="POST" action="{{ route('login') }}">
      @csrf
    
      <div class="row mb-2">
          <label for="email" class="col-md-12">{{ __('Email Address') }}</label>
    
          <div class="col-md-12 @error('email') has-error @enderror">
              <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" autocomplete="email" autofocus>
    
              @error('email')
                  <span class="invalid-feedback" role="alert">
                      <strong>{{ $message }}</strong>
                  </span>
              @enderror
          </div>
      </div>
    
      <div class="row mb-2">
          <label for="password" class="col-md-12">{{ __('Password') }}</label>
    
          <div class="col-md-12 @error('password') has-error @enderror">
              <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" autocomplete="current-password">
    
              @error('password')
                  <span class="invalid-feedback" role="alert">
                      <strong>{{ $message }}</strong>
                  </span>
              @enderror
          </div>
      </div>
    
      <div class="row mb-2">
        <div class="col-md-12">
              <div class="form-check">
                  <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
    
                  <label class="form-check-label" for="remember">
                      {{ __('Remember Me') }}
                  </label>
              </div>
          </div>
      </div>
    
      <div class="row mb-0">
          <div class="col-md-12">
              <button type="submit" class="w-100 btn btn-primary">
                  {{ __('Login') }}
              </button>
    
              @if (Route::has('password.request'))
                  <a class="btn btn-link" href="{{ route('password.request') }}">
                      {{ __('Forgot Your Password?') }}
                  </a>
              @endif
          </div>
      </div>
    </form>
    

    编辑:

    在里面 app\Http\Controllers\Auth\LoginController.php ,我已覆盖 credentials 来自AuthenticatesUsers.php:

    protected function credentials(Request $request)
     {
       return array_merge($request->only($this->username(), 'password'), ['active' => 1]);
     }
    

    但具体信息的问题仍然存在:(

    问题:

    1. 如何添加自定义消息,如:“您的帐户已被暂停”?
    2. 有没有更好的替代方法 return array_merge($request->only($this->username(), 'password'), ['active' => 1]) 在AuthenticatesUsers.php中?
    0 回复  |  直到 2 年前
        1
  •  1
  •   Razvan Zamfir    2 年前

    以下是一个可行的解决方案,尽管并不完美:

    在里面 app\Http\Controllers\Auth\LoginController.php ,我已覆盖 authenticated 方法,而不是 credentials 方法:

    protected function authenticated()
    {
      if (Auth::user()->active !== 1) {
        Auth::logout();
        return redirect('/login')->withError('Your account is not active!');
      }
    }
    

    在登录视图中,表单上方:

    <div class="alert alert-danger alert-dismissible">
        <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
        <p class="my-0 text-center">{{ session('error') }}</p>
    </div>
    

    enter image description here