다음은 Laravel 프레임워크튜토리얼 칼럼Laravel에서 소개한 내용입니다. 등록 재구성이 필요한 친구들에게 도움이 되었으면 좋겠습니다!
백엔드 콘텐츠 관리 시스템을 구축하려면 laravel을 사용해야 하는데 laravel의 기본 로그인 등록으로는 현재 요구 사항을 충족할 수 없습니다.
등록하면 백엔드에서 사용되며 이메일 등록이 필요하지 않으며, 추가 등록 시 구성을 함께 입력해야 합니다.
laravel을 설치하면 기본적으로 생성된 등록이 이메일로 등록되는데 일부 옵션은 필수가 아니며 일부 양식 옵션을 추가해야 합니다
등록을 하면, 임의로 등록하는 것은 불가능하며 일부 최고 관리자만 등록할 수 있습니다. 먼저 구성을 위해 지난번에 생성한 UserController
를 사용합니다. 그렇지 않은 경우 php artisan make:controller UserController code>컨트롤러 클래스를 생성한 다음 <br> 두 개의 경로 <code>Route::get('register', 'UserController@getRegister')
및 Route::post('register', 'UserController @postRegister')
UserController
进行配置,如果没有的话,可以使用php artisan make:controller UserController
创建一个控制器类
然后创建两条路由Route::get('register', 'UserController@getRegister')
和Route::post('register', 'UserController@postRegister')
前者是显示一个注册的页面get请求,后面是注册账号的post请求。
这个使用的是getRegister
这个方法,这个方法只需要显示一个视图所以并没有特别的逻辑
public function getRegister() { return view('auth.register'); }
这个使用的是postRegister
这个方法
注册账号的话和重置密码一样,而且比注册账号还要简单点。
我们在往数据库里插入一条用户纪录的时候,可以使用User::create($data)
进行插入。$data
是个数组,里面存放了每个字段的键和值
public function postRegister(Request $request) { $rules = [ 'username'=>'required|unique:finance_enewsuser', 'password' => 'required|between:6,20|confirmed' ]; $messages = [ 'required'=>':attribute不能为空', 'unique'=>'用户名已被注册', 'between' => '密码必须是6~20位之间', 'confirmed' => '新密码和确认密码不匹配' ]; $username = $request->input('username'); $password = $request->input('password'); $group = $request->input('group'); $data = $request->all(); $validator = Validator::make($data, $rules, $messages); if ($validator->fails()) { return back()->withErrors($validator); } $data = [ 'username' => $username, 'password' => bcrypt($password), 'groupid' => $group, 'checked' => 0, 'styleid' => 1, 'filelevel' => 0, 'loginnum' => 0, 'lasttime' => time(), 'lastip' => '127.0.0.1', 'truename' => '', 'email' => '', 'pretime' => time(), 'preip' => '127.0.0.1', ]; User::create($data); //插入一条新纪录,并返回保存后的模型实例 //如果注册后还想立即登录的话,可以使用$user = User::create($data); Auth::login($user); 进行认证 return redirect('/'); }
UserController
public function getRegister() { return view('auth.register'); } public function postRegister(Request $request) { $rules = [ 'username'=>'required|unique:finance_enewsuser', 'password' => 'required|between:6,20|confirmed' ]; $messages = [ 'required'=>':attribute不能为空', 'unique'=>'用户名已被注册', 'between' => '密码必须是6~20位之间', 'confirmed' => '新密码和确认密码不匹配' ]; $username = $request->input('username'); $password = $request->input('password'); $group = $request->input('group'); $data = $request->all(); $validator = Validator::make($data, $rules, $messages); if ($validator->fails()) { return back()->withErrors($validator); } $data = [ 'username' => $username, 'password' => bcrypt($password), 'groupid' => $group, 'checked' => 0, 'styleid' => 1, 'filelevel' => 0, 'loginnum' => 0, 'lasttime' => time(), 'lastip' => '127.0.0.1', 'truename' => '', 'email' => '', 'pretime' => time(), 'preip' => '127.0.0.1', ]; User::create($data); //插入一条新纪录,并返回保存后的模型实例 return redirect('/'); }
register.blade
<form class="login-form" action="{{ url('/register') }}" method="post"> {!! csrf_field() !!} <h3 class="font-green">Sign Up</h3> @if(count($errors) > 0) <p class="alert alert-danger display-hide" style="display: block;"> <button class="close" data-close="alert"></button> <span> {{ $errors->first() }} </span> </p> @endif <p class="form-group"> <label class="control-label visible-ie8 visible-ie9">用户名</label> <input class="form-control placeholder-no-fix" type="text" autocomplete="off" placeholder="Username" name="username"> </p> <p class="form-group"> <label class="control-label visible-ie8 visible-ie9">密码</label> <input class="form-control placeholder-no-fix" type="password" autocomplete="off" id="register_password" placeholder="Password" name="password"> </p> <p class="form-group"> <label class="control-label visible-ie8 visible-ie9">重复密码</label> <input class="form-control placeholder-no-fix" type="password" autocomplete="off" placeholder="Repeat password" name="password_confirmation"> </p> <p class="form-group"> <label class="control-label visible-ie8 visible-ie9">用户组</label> <select name="group" class="form-control"> <option value="1"> 超级管理员 </option> <option value="2"> 管理员 </option> <option value="3"> 编辑 </option> </select> </p> <p class="form-actions"> <button type="submit" id="register-submit-btn" class="btn btn-success uppercase pull-right">注册</button> </p> </form>
现在注册都完成了,我们就差用户的判断了。
需求注册账号必须只能是有超级管理员权限的账号才可以注册。
这种情况下按照我们一般的步骤就是在postRegister
方法里直接查出用户的信息,然后查看用户是否满足这个权限,不满足的情况下就跳转到其它页面。
这种方法可以,但是,我们既然有超级管理员和管理员这些权限区分,肯定不止一个地方使用,其它地方也会用到。
然后会有人想到在model里写个方法,以后有需要都可以直接调用。
这个方法也可以,不过,我们推荐使用laravel提供的中间件这个功能,这个功能非常强大,也非常好用。现在我们就使用中间件这个功能。
因为我们是后台内容管理系统,所以,我们首先创建一个中间件,功能是,所有页面进入前,必须是登录状态,否则跳到登录页。
查看手册发现可以使用php artisan make:middleware CheckLoginMiddleware
命令创建一个中间件,当然复制一个差不多的文件,改下也是一样的。
然后会在app/Http/Middleware/
目录下创建了一个CheckLoginMiddleware
中间件文件,里面只有一个handle()
方法,我们直接在里面增加我们的功能
<?php namespace App\Http\Middleware; use Closure; use Auth; class CheckLoginMiddleware { public function handle($request, Closure $next) { //使用Auth方法,需要引入use Auth;方法 //$request->is('login')表示请求的URL是否是登录页 //因为我们打算使用全局的,所以,需要把登录页排除,不然会无限重定向 //如果你的登录页不是/login,而是/auth/login的话,就写$request->is('auth/login') //并且我们要在请求处理后执行其任务,因为我们需要获取到用户的登录信息 $response = $next($request); if (!Auth::check() && !$request->is('login')) { return redirect('/login'); } return $response; } }
这个中间件的功能是,如果有路由产生,首先使用Auth::check()
判断用户是否登录,如果没有登录的跳转到登录页。
方法写好了,但是还不能使用,我们需要注册下这个中间件,告诉框架我们这个中间件写好了,可以使用了,使用的范围是哪里。
在app/Http/
目录下有个Kernel.php
文件是注册这个中间件的,也就是告诉框架,我们写好了这个中间件。
而Kernel.php
文件里有两个数组属性,一个$middleware
表示全局使用,一个$routeMiddleware
表示可以选择使用。
全局使用的意思是,不管你请求哪个页面,都会先执行这个中间件。
选择使用表示,需要哪个HTTP请求,要求执行中间件,就在哪个地方执行。
这里每个页面都要求必须登录的话,可定是注册一个全局的,在$middleware
전자는 등록된 페이지를 표시하기 위한 get 요청이고, 이어서 계정 등록을 위한 post 요청입니다.
2. 등록 계정 페이지 표시
\App\Http\Middleware\CheckLoginMiddleware::class3. 🎜🎜postRegister
메소드를 사용합니다. 🎜계정 등록은 비밀번호 재설정과 동일하며, 계정 등록보다 간단합니다. 🎜사용자 레코드를 데이터베이스에 삽입할 때User::create($data)
를 사용하여 삽입할 수 있습니다. 🎜$data
는 각 필드의 키와 값을 저장하는 배열입니다🎜<?php namespace App\Http\Middleware; use Closure; use Auth; class CheckGroupMiddleware { public function handle($request, Closure $next) { $user = Auth::user(); if ($user->groupid != 1) { return redirect('/'); } return $next($request); } }🎜4. 완성된 예시🎜🎜UserController🎜'user.group' => \App\Http\Middleware\CheckGroupMiddleware::class🎜register.blade🎜Route::get('/', ['middleware' => ['user.group'], function () { // }]);🎜5. in🎜🎜이제 등록이 완료되었으니 사용자의 판단만 필요합니다. 🎜필수 계정 등록은 최고 관리자 권한이 있는 계정이어야 합니다. 🎜이 경우 일반적인 절차는postRegister
메소드에서 사용자 정보를 직접 확인한 후 해당 권한을 충족하는지 확인하는 것입니다. 그렇지 않은 경우 다른 페이지로 이동합니다. 🎜이 방법도 괜찮지만, 최고 관리자와 관리자 권한이 있기 때문에 여러 곳에서 사용해야 하고, 다른 곳에서도 사용하게 됩니다. 🎜그러면 누군가는 나중에 필요할 때 직접 호출할 수 있는 메서드를 모델에 작성하는 것을 생각할 것입니다. 🎜이 방법도 가능하지만, laravel에서 제공하는 미들웨어 기능을 사용하는 것이 좋습니다. 이 기능은 매우 강력하고 사용하기 쉽습니다. 이제 미들웨어 기능을 사용해 보겠습니다. 🎜우리는 백엔드 콘텐츠 관리 시스템이기 때문에 먼저 미들웨어를 만듭니다. 이 기능은 모든 페이지에 로그인하기 전에 로그인해야 하며, 그렇지 않으면 로그인 페이지로 이동합니다. 🎜 매뉴얼을 확인하여php artisan make:middleware CheckLoginMiddleware
명령을 사용하여 미들웨어를 생성할 수 있는지 확인하세요. 물론 비슷한 파일을 복사하여 같은 방식으로 변경하세요. 🎜그러면app/Http/Middleware/
디렉터리에CheckLoginMiddleware
미들웨어 파일이 생성됩니다. 여기에는handle()
메서드가 하나만 있습니다. . 🎜$this->middleware('user.group');🎜내부에 직접 함수를 추가합니다. 이 미들웨어의 기능은 경로가 생성되면 먼저Auth::check()
를 사용하여 사용자가 로그인했는지 확인하는 것입니다. 그렇지 않은 경우, 로그인 페이지로 이동합니다. 🎜메서드가 작성되었지만 아직 사용할 수 없습니다. 이 미들웨어를 등록하고 미들웨어가 작성되어 사용할 수 있다는 것과 사용 범위가 무엇인지 프레임워크에 알려주어야 합니다. 🎜app/Http/
디렉토리에 이 미들웨어를 등록하는Kernel.php
파일이 있는데, 이는 우리가 이 미들웨어를 작성했음을 프레임워크에 알려줍니다. 🎜Kernel.php
파일에는 두 개의 배열 속성이 있습니다. 하나는 전역 사용을 의미하는$middleware
이고 다른 하나는 선택적 사용을 의미하는$routeMiddleware
입니다. 🎜전역적으로 사용한다는 것은 어떤 페이지를 요청하든 이 미들웨어가 먼저 실행된다는 의미입니다. 🎜필요한 HTTP 요청과 미들웨어 실행이 필요한 위치를 나타내는 데 사용하도록 선택하세요. 🎜여기의 모든 페이지에서 로그인이 필요한 경우 전역 페이지를 등록하면$middleware
배열 속성에 🎜🎜Route::get('register', 'UserController@getRegister')->middleware('user.group'); Route::post('register', 'UserController@postRegister')->middleware('user.group');🎜를 추가하고 등록하면 사용할 수 있습니다🎜🎜🎜🎜 추신: 전역 페이지를 정의하는 경우 각별히 주의해야 합니다. 예를 들어 위의 로그인 페이지를 제외해야 합니다. 그렇지 않으면 사용자가 로그인하지 않았기 때문에 모든 페이지가 로그인 페이지로 리디렉션됩니다. 물론 로그인 페이지도 포함🎜
现在是进行用户权限页面的限制,同样我们也要重新创建一个中间件
使用php artisan make:middleware CheckGroupMiddleware
创建一个新的中间件,用来判断这个用户是否满足这个权限
<?php namespace App\Http\Middleware; use Closure; use Auth; class CheckGroupMiddleware { public function handle($request, Closure $next) { $user = Auth::user(); if ($user->groupid != 1) { return redirect('/'); } return $next($request); } }
这里我们还是通过Auth::user()
来获取到用户的信息,然后判断用户的组,不属于超级管理员就跳到首页。
然后我们在到app/Http/
目录下有个Kernel.php
文件是注册这个中间件的,这次我们注册为可以选择的中间件。
这个中间件因为是可以选择的,所以我们还需要给它起个别名,在$routeMiddleware
数组属性里加如一条
'user.group' => \App\Http\Middleware\CheckGroupMiddleware::class
创建一个可以使用usergroup
这个名字使用的中间件。
创建好后,我们可以选择在哪里使用,一个是在router.php
的路由文件里加入,一个是在controller里使用
在router.php
文件里使用
Route::get('/', ['middleware' => ['user.group'], function () { // }]);
在控制器内使用
$this->middleware('user.group');
这里我们选择在路由里添加中间件。让注册页面只能是超级管理员才可以注册
Route::get('register', 'UserController@getRegister')->middleware('user.group'); Route::post('register', 'UserController@postRegister')->middleware('user.group');
我们目前只有两个路由要判断权限,所以使用了链式的写法,当然你也可以按照手册里上使用组的方式,组的方式更为优雅。
当然如果你的整个控制器内的方法都需要中间件进行验证过滤的话,你也可以创建组的形式,也可以直接在控制器内使用
__construct
方法,让每次请求这个控制器时,先执行中间件
class MyController extends Controller { public function __construct() { $this->middleware('user.group'); } public function index() { return view('my.index'); } }
위 내용은 Laravel 등록 리팩토링에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!