我在后端应用程序中使用了laravel bcrypt身份验证,但客户端询问了普通密码身份验证,以便他可以将每个用户的密码视为管理员。我的整个应用程序逻辑是lalavel内置身份验证方法和bcrypt哈希。如何将其替换为使用存储在数据库中的普通密码mach进行身份验证而不是存储哈希?
答案 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
虽然我同意在生产环境中你不应该这样做。但是我可以看到一些应用程序,如果用户知道密码是以纯文本形式存储的,那么可能没问题。