我正在为我的应用程序使用Laravel 4。 在这个应用程序中,我有两个auth模型:买家和用户。我不会使用User-> type字段,因为这个模型有完全不同的逻辑。
这是我的登录控制器:
public function postIndex()
{
if (Auth::attempt(array_only(Input::get(), array('email', 'password')), array_only(Input::get(), array('save')))) {
Login::create(array('user_id' => Auth::user()->id, 'session_id' => session_id())); // Создаем новую запись логина вместе с session_id.
return Redirect::to('/');
}
return $this->userauth();
}
public function userauth() {
Config::set('auth.model', 'User');
Config::set('auth.table', 'users');
$test = Config::get('auth.model');
if (Auth::attempt(array_only(Input::get(), array('email', 'password')), array_only(Input::get(), array('save')))) {
Login::create(array('user_id' => Auth::user()->id, 'session_id' => session_id())); // Создаем новую запись логина вместе с session_id.
return Redirect::to('/');
}
Session::flash('error', 'Auth not excepted. '. implode(' ', array_only(Input::get(), array('email', 'password'))));
return Redirect::to('logins')->withInput(Input::except('password'));
}
我已经更改了auth.php中的设置以与买家合作。当我为买家输入登录名和密码时,一切都很好。看来,在Auth :: attempt()之后,它不会改变设置。看起来我必须重新加载Auth对象。有人可以帮帮我吗?
如果我这样写的话,买路:
public function postIndex()
{
Config::set('auth.model', 'User');
Config::set('auth.table', 'users');
$test = Config::get('auth.model');
if (Auth::attempt(array_only(Input::get(), array('email', 'password')), array_only(Input::get(), array('save')))) {
Login::create(array('user_id' => Auth::user()->id, 'session_id' => session_id())); // Создаем новую запись логина вместе с session_id.
return Redirect::to('/');
}
Session::flash('error', 'Auth not excepted. '. implode(' ', array_only(Input::get(), array('email', 'password'))));
return Redirect::to('logins')->withInput(Input::except('password'));
}
一切都很有效。
答案 0 :(得分:4)
简答:
你是对的。第一次调用Auth::attempt()
后对配置的更改无效。在运行时,您必须使用Auth::setProvider()
来设置将使用的模型。
长答案: 我不知道这在你的特定设置中会有多好,但我在尝试做类似的事情时发现了你的问题,所以我会告诉你我是怎么做到的。
就我而言,要求不仅仅是拥有两种不同类型的用户。我在同一代码库的不同域上运行两个网站,一个用于学生,一个用于寄宿家庭。我有一个Student
类将替换一个网站上的User
,Host
用于替换另一个网站上的UserInterface
。两者都实现RemindableInterface
和Route::filter('prep.student', function() {
Auth::setProvider(new Illuminate\Auth\EloquentUserProvider(App::make('hash'), 'Student'));
});
Route::filter('prep.host', function() {
Auth::setProvider(new Illuminate\Auth\EloquentUserProvider(App::make('hash'), 'Host'));
});
,所以我们在那里很好。
在app / filters.php中,我创建了两个特殊的过滤器:
/**
* Routes for Students
*/
Route::group(array('domain' => '[student domain]', 'before' => 'prep.student'), function() {
Route::get('test', function() {
return View::make('student/test');
});
...
});
/**
* Routes for Hosts
*/
Route::group(array('domain' => '[host domain'], 'before' => 'prep.host'), function() {
Route::get('test', function() {
return View::make('host/test');
});
...
});
此处“Host”和“Student”是您希望Eloquent身份验证驱动程序使用的类名。
在app / routes.php中,我将我的路由分成两组,在每组中我使用了上面适当的过滤器:
app/start/global.php
结果是为每组路由设置了适当的模型。您也可以在User
中设置提供程序,但我决定将其保留在路由中,以便很清楚这两组路由是针对两个不同的域并具有两种不同的身份验证模型。
如果我将它构建为新的,我会这样做有点不同,但这两个网站是一个大型遗留代码库的前端,我无法对其进行大幅改动,因此我承认这有点像黑客攻击。如果您不是这种情况,更好的解决方案可能是拥有{{1}}类进行身份验证,然后将其附加到您需要的其他两个模型。