已禁用用户,没有更优雅的写法

目前是这样写的!
users表中有个status 字段,0禁止登陆 1正常登录;请问有没有更优雅的写法?而且这种写法“你的账户已被禁用”无法返回到模板中

 public function store(Request $request)
    {
        //省略验证部分
        $data = $request->only([ 'email', 'password']);
        if ($data['status'] == 1)
        {
        }else{
            return '你的账户已被禁用';
        }
       if (Auth::attempt($data)){
           return redirect()->route('orders.index')->with('success','登录成功');
       }else{
           return redirect()->back()->with('errors','登陆失败');
       }
    }
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
bing8u
最佳答案

更改文件 app/Http/Controllers/Auth/LoginController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = '/home';

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    // 楼主仅仅需要此方法,就可完成。
    protected function authenticated(Request $request, $user)
    {
        if (!$user->status) {
            Auth::logout();
            throw ValidationException::withMessages([
                'status' => ['你的账号被禁用'],
            ]);
        }
    }
}

至于登录后需要转跳到订单列表,只要订单列表使用了中间件:"auth",那么登录后会自动重定向到 订单列表页面去,

4年前 评论
李小明 (楼主) 4年前
讨论数量: 10

在 User 模型中增加一个方法 disabled

public function disabled() 
{
    return $this->status == 0;
}

然后改一下 store 方法:

public function store(Request $request)
{
    if (!Auth::attempt($request->only(['email', 'password']))) {
        return '密码错误';
    }

    if (Auth::user()->disabled()) {
        Auth::logout();
        return '账号被禁用';
    }

    return '登录成功';
}

也可以加一个中间件,然后通过 Auth::user()->disabled() 来判断是否被禁用

4年前 评论
XISHAN 4年前
李小明 (楼主) 4年前
李小明 (楼主) 4年前
她和她的猫 (作者) 4年前

你要返回这个状态的话就单独定义成变量然后返回出去,你直接返回肯定是接收不到的,最后一句代码又重定向了。这就挺优雅的处理方法简单且满足需求就可以,没必要加很多花里胡哨的功能。

4年前 评论
  • 首先, store 方法一般用来数据,而不是用来登录。
  • 其次,用户表里有个 deleted_at 不知道你注意到了没有。
  • 现在,丢掉这段

        if ($data['status'] = true)
        {
    
        }else{
            return '你的账户已被禁用';
        }
  • 以后再有用户禁用,直接把他 deleted 掉即可。
  • 其实,不需要向用户展示帐号被禁用,直接告诉他无法登录即可。可能没有此用户名,可能密码不对,可能用户被管理员停用,可能因为帐号涉黄被外部要求关闭了。没必要每种情况都写个通知出来,告诉他无法登录,有问题找客服总行。
  • 另,为什么 redirect back 的时候还是 success ?
4年前 评论
ghdlk 4年前
qufo (作者) 4年前

@qufo 使用 deleted 来表示禁用,显然不合适,删除与禁用是两个完全不同的概念与动作

4年前 评论
Imuyu 4年前

if else 改为 if

如果在设计上有考虑,就把禁用单独拿出来(不要 DRY),全局统一规范

if (empty(data['status'])) {
    return '你的账户已被禁用'
}
4年前 评论
李小明 (楼主) 4年前
playmaker

为啥不用中间件处理

4年前 评论

你这个代码格式,啊~~

4年前 评论
李小明 (楼主) 4年前

就这样写就可以啦,业务考虑的是怎么简单快速实现,而不是为了优雅而优雅。

    if($data['status'] == 0){
        return "账号被禁用";
}
4年前 评论
李小明 (楼主) 4年前
李小明 (楼主) 4年前
cbasil (作者) 4年前

在 User 模型中增加一个方法 disabled

public function disabled() 
{
    return $this->status == 0;
}

然后改一下 store 方法:

public function store(Request $request)
{
    if (!Auth::attempt($request->only(['email', 'password']))) {
        return '密码错误';
    }

    if (Auth::user()->disabled()) {
        Auth::logout();
        return '账号被禁用';
    }

    return '登录成功';
}

也可以加一个中间件,然后通过 Auth::user()->disabled() 来判断是否被禁用

4年前 评论
XISHAN 4年前
李小明 (楼主) 4年前
李小明 (楼主) 4年前
她和她的猫 (作者) 4年前
bing8u

更改文件 app/Http/Controllers/Auth/LoginController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = '/home';

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    // 楼主仅仅需要此方法,就可完成。
    protected function authenticated(Request $request, $user)
    {
        if (!$user->status) {
            Auth::logout();
            throw ValidationException::withMessages([
                'status' => ['你的账号被禁用'],
            ]);
        }
    }
}

至于登录后需要转跳到订单列表,只要订单列表使用了中间件:"auth",那么登录后会自动重定向到 订单列表页面去,

4年前 评论
李小明 (楼主) 4年前
public function signin(Request $request, Hasher $hasher)
{
    $credentials = $this->validate($request, [
        'username' => 'required',
        'password' => 'required',
    ], [
        'username.required' => '请输入您的账户',
        'password.required' => '请输入您的密码',
    ]);

    $provider = new EloquentUserProvider($hasher, User::class);

    /**
     * 根据用户凭证获取用户信息
     *
     * @var User $user
     */
    $user = $provider->retrieveByCredentials($credentials);

    if ($user && $provider->validateCredentials($user, $credentials)) {
        if ($user->disabled()) {
            return failed('账户已被禁用', 400);
        }
        try {
            if (!$token = $this->guard()->login($user)) {
                return failed('认证失败,用户名或密码不正确', 401);
            }
        } catch (JWTException $exception) {
            return internalError();
        }

        return success([
            'id' => $user->id,
            'name' => $user->name,
            'email' => $user->email,
            'avatar' => $user->avatar,
            'access_token' => $token,
            'token_type' => 'Bearer',
            'expires_in' => config('jwt.ttl') * 60,
        ]);
    }

    return failed('认证失败,用户名或密码不正确', 401);
}

可以自己实例化一个 EloquentUserProvider ,然后获取用用户信息,在进行验证,Auth 也是这么个流程。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!