在laravel 5身份验证中使用普通密码而不是bcrypt

时间:2015-04-15 08:19:42

标签: laravel-5

我在后端应用程序中使用了laravel bcrypt身份验证,但客户端询问了普通密码身份验证,以便他可以将每个用户的密码视为管理员。我的整个应用程序逻辑是lalavel内置身份验证方法和bcrypt哈希。如何将其替换为使用存储在数据库中的普通密码mach进行身份验证而不是存储哈希?

5 个答案:

答案 0 :(得分:3)

class AuthController extends Controller
{

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    public function __construct()
    {
        $this->middleware('guest', ['except' => ['getLogout', 'getLogin']]);
    }

    public function postLogin()
    {
        $data = \Request::all();

        $rules = [
            'email' => 'required|email|max:255|exists:users',
            'password' => 'required|exists:users'
        ];

        $validator = \Validator::make($data, $rules);

        if ($validator->fails()) {
            //login data not exist in db
            return redirect('/login')->withErrors($validator)->withInput();
        } else {
            $email = Request::input('email');
            $pass = Request::input('password');
            //in my table users, status must be 1 to login into app
            $matchWhere = ['login' => $email, 'password' => $pass, 'status' => 1];

            $count = \App\User::where($matchWhere)->count();

            if ($count == 1) {
                $user = \App\User::where($matchWhere)->get();
                $user_id = null;
                foreach ($user as $u) {
                    $user_id = intval($u->id);
                }

                Auth::loginUsingId($user_id);

                //start session and save data

                return redirect()->intended('/');
            } else {
                //not status 1 or active
                $validator->errors()->add('Unauthorized', 'Not accepted in community yet');
                return redirect('/login')->withErrors($validator)->withInput();
            }
        }
    }

    public function getLogin()
    {
        //fix for infinite loop in my app
        if (Auth::check()) {
            return redirect()->intended('/');
        } else {
            return view('auth.login');
        }
    }

    public function getLogout()
    {
        Auth::logout();
        return redirect()->intended('/login');
    }
}

答案 1 :(得分:0)

在laravel 4中,您可以重写HASH模块。这个stackoverflow thread解释了如何使用SHA1而不是bycrypt [检查接受的答案和评论]。

您可以使用此处说明的方法并保存密码而不进行散列。

答案 2 :(得分:0)

嗯,这真的会损害您客户的网站安全性。 根本不建议在数据库中存储普通密码。如果有人获得了对数据库的访问权限,他/她的网站将非常容易受到攻击,任何拥有该数据库副本的人都可以轻松访问所有类型的帐户。我坚持要你创建一个重置/更改密码功能,而不是在数据库中存储普通密码。 无论如何,你可以用

获得普通密码
$password = Input::get('password');

我猜您可以使用

对用户进行身份验证
if (Auth::attempt(array('password' => $password)))
{
    return Redirect::route('home');
}

答案 3 :(得分:0)

如果你现在正在使用Laravel 5 ^,你可以通过搜索类Illuminate / Auth / EloquentUserProvider来做到这一点并在那里进行一些小的调整。

例如找到公共函数retrieveByCredentials()和validateCredentials()。在第二个函数中,您可以看到laravel正在检查散列的密码,以便将其输入到Auth :: attempt()方法中。只需将其更改为普通检查即可完成。

 public function retrieveByCredentials(array $credentials)
{
    if (empty($credentials)) {
        return;
    }

    // First we will add each credential element to the query as a where clause.
    // Then we can execute the query and, if we found a user, return it in a
    // Eloquent User "model" that will be utilized by the Guard instances.

    $query = $this->createModel()->newQuery();

    foreach ($credentials as $key => $value) {
        if (! Str::contains($key, 'password')) {
            $query->where($key, $value);
        }
    }

    return $query->first();
}

/**
 * Validate a user against the given credentials.
 *
 * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
 * @param  array  $credentials
 * @return bool
 */
public function validateCredentials(UserContract $user, array $credentials)
{
    $plain = $credentials['password'];

    return $this->hasher->check($plain, $user->getAuthPassword());
}

更改$ this-> hasher->检查正常检查,您将完成。 :)

答案 4 :(得分:0)

哇,这些都很复杂,就像它一样简单。

viewDidLoad

虽然我同意在生产环境中你不应该这样做。但是我可以看到一些应用程序,如果用户知道密码是以纯文本形式存储的,那么可能没问题。