注册后,用户状态默认设置为0,表示未激活。然后管理员需要批准(激活)他的帐户,然后他就可以打开所有其他路线。 我怎样才能在Laravel中实现这一目标?现在我使用中间件:
public function handle($request, Closure $next)
{
if (Auth::user()->userActive == 1) {
return $next($request);
} else {
return redirect('userNotActive');
}
}
我将它添加到路线:
Route::get('home', 'HomeController@index')->middleware('active');
Route::get('search', 'SearchController@searchFilter')->middleware('active');
Route::get('user/{id}', 'UserController@show')->middleware('active');
但是使用这个我需要手动将中间件添加到所有路由。有没有办法在登录后能够实现这一点,以便自动对所有路线有效?
答案 0 :(得分:3)
我几乎不建议您使用Route :: group like
Route::group( ['middleware' => 'active'], function(){
Route::get('home', 'HomeController@index');
Route::get('search', 'SearchController@searchFilter');
Route::get('user/{id}', 'UserController@show');
});
所以您需要做的就是添加需要检查用户是否在该组中处于活动状态的所有页面。
答案 1 :(得分:0)
这是可能的。只需覆盖Login Controller中的laravel默认登录方法。这是我的一个laravel项目的工作代码。不需要中间件
class LoginController {
public function login(Request $request)
{
$this->validateLogin($request);
// If the class is using the ThrottlesLogins trait, we can automatically throttle
// the login attempts for this application. We'll key this by the username and
// the IP address of the client making these requests into this application.
if ($this->hasTooManyLoginAttempts($request)) {
$this->fireLockoutEvent($request);
return $this->sendLockoutResponse($request);
}
$credentials =['email'=>$request->email, 'password'=>$request->password];
if($this->guard()->attempt($credentials,$request->has('remember'))){
if(auth()->user()->active !=1){ //Account has not being activated!
$this->logout($request);
return back()
->withInput()
->withErrors(['email'=>'Your account is inactive. Click on the activation link sent to your account to activate it']);
}
return $this->sendLoginResponse($request);
}
// If the login attempt was unsuccessful we will increment the number of attempts
// to login and redirect the user back to the login form. Of course, when this
// user surpasses their maximum number of attempts they will get locked out.
$this->incrementLoginAttempts($request);
return $this->sendFailedLoginResponse($request);
}
}
答案 2 :(得分:0)
有很多方法可以做到这一点。您可以通过中间件创建中间件和组路由,您可以添加角色并按角色允许,您可以验证输入,所有这些都取决于您希望如何组织或设计项目。我通常根据我的需要和formrequests创建中间件。
我可能会在Login方法上实现@Samuel James答案,而对于所有其他端点,请使用下面的表单请求。 表单请求类似于:
创建formrequest
php artisan make:request LoginAccess
并且使用此LoginAccess文件,我有一套规则和授权(认为用户模型与您使用的Auth相同)
public function authorize(Request $request) {
if (Auth::user()->userActive == 1) {
return true;
}
return false;
}
public function forbiddenResponse() {
return redirect('userNotActive');
//return response()->view('errors.403');
}
public function rules()
{
return [
//whatever rules you require, example here
'email' => 'required|email|unique:users,email,',
'password' => 'required|min:6|password|confirmed',
];
}
并且在您的控制器中,您可以使用LoginAccess验证您需要的任何方法。
public function SomeMethodThatNeedsUserLoggedInAndValidated(LoginAccess $request)
{
}
答案 3 :(得分:0)
在您的注册方法中添加此行以直接登录用户:
if (Auth::attempt(['email' => $email, 'password' => $password])) {
// might need to add this too:
Auth::user()->userActive = 1;
// Authentication passed... user is logged in and active
// @TODO : return redirect to your login start page or whatever you want to handle after login
}
您的中间件需要更改为:(由SO用户@Demonyowh建议)。这只是最佳实践,更易于使用。
Route::group( ['middleware' => 'active'], function(){
Route::get('home', 'HomeController@index');
Route::get('search', 'SearchController@searchFilter');
Route::get('user/{id}', 'UserController@show');
});
现在,当您使用register方法登录用户时,也可以允许用户访问中间件active
答案 4 :(得分:0)
我是Laravel的新手,这也针对新手。长期以来,我随时都可以告诉我为什么这是不好的做法,因为我真的还不知道什么更好。
截至2019年8月24日-使用Laravel 5.8-这是我个人的实现方式。
所做的假设:
在这种情况下,您可以不使用LoginController。
相反,打开“ Illuminate / Auth / Middleware / Authenticate.php”,然后将handle()方法替换为:
public function handle($request, Closure $next, ...$guards)
{
if(!$request->user()->active){
// you can change 'login' to whatever you need
return redirect('login')->with($this->auth->logout());
}
$this->authenticate($request, $guards);
return $next($request);
}
注意:Auth :: logout()在这里不起作用,但是已经通过文件顶部的构造函数拉入了。
public function __construct(Auth $auth)
{
$this->auth = $auth;
}
所以您可以只使用$ this-> auth-> logout();代替。
考虑一下-您可以轻松地将“ active”交换为几乎所有条件,并以相同的方式更新此中间件。
希望这会有所帮助!