在很多時候,我們需要前臺和後臺進行不同的登錄操作,以限制用戶許可權,現在用 Laravel 實現這個需求。 前戲 一、獲取 Laravel 這個在文檔中都有說明的,也比較簡單,可以使用 composer 下載(我下載的時候是有些慢),我就複製之前下載好的空項目。 二、修改配置文件 在這一步我只修改了 ...
在很多時候,我們需要前臺和後臺進行不同的登錄操作,以限制用戶許可權,現在用 Laravel 實現這個需求。
前戲
一、獲取 Laravel
這個在文檔中都有說明的,也比較簡單,可以使用 composer 下載(我下載的時候是有些慢),我就複製之前下載好的空項目。
二、修改配置文件
在這一步我只修改了 .env 文件中的資料庫配置。
三、運行項目
在項目根目錄,運行
php artisan serve
在瀏覽器中輸入 http://127.0.0.1:8000 訪問自己的項目。
進入正題
有兩種方式實現前後臺用戶的分離登錄,使用兩個數據表或者使用一個數據表。
一、使用兩個表(前臺用戶表和後臺用戶表)
1、創建數據表
在項目根目錄運行
php artisan make:migration create_users_table
執行上面的命令會在 database/migrations 目錄下生成遷移文件 xxxx_create_users_table.php,這個文件在下載項目的時候是有的,可以直接修改,當然,多生成一個也沒有關係吧。
修改 xxxx_create_users_table.php 文件(如果已經執行了上面的命令,修改的時候註意文件 xxxx 部分的日期,不要改錯了)。
這裡我多加了一個欄位,用來判斷用戶是否允許登錄。
在修改完成之後執行遷移。
php artisan migrate
執行成功後,會在配置好的資料庫中生成對應的表
users 表就是我們要用到的前臺用戶表,然後用同樣的方法,生成一個後臺用戶表
運行php artisan make:migration create_admins_table
修改 xxxxx_create_admins_table.php 中的內容
執行遷移:php artisan:migrate
到這裡,兩個數據表就完成了。
2、實現基本的登錄
運行 php artisan make:auth 命令
這時會看到 app 目錄下多了 User.php。
在 app 目錄下新建 Models 目錄,用來存放模型,將 User.php 移動到 Models 目錄。 修改 User.php 中的內容(可以不移動,省去好多操作)。
改為:
打開 config 文件夾下的 auth.php
改為
然後打開 Http/Controllers 文件夾,裡面多了一個 Auth 文件夾,裡面有我們註冊登錄使用的控制器。
打開 routes 文件夾下的 web.php 文件,修改
為:
這時刷新瀏覽器頁面,會發現跳轉到了登錄界面,當然,目前用戶表中沒有添加任何數據,現在向用戶表中添加數據:
運行php artisan make:seeder UsersTableSeeder
運行成功之後,會在 database/seeds 目錄下生成 UsersTableSeeder.php 文件,打開這個文件,在 run 這個方法中添加下麵的內容:
然後打開 DatabaseSeeder.php,在裡面添加:
完成編寫之後,運行 composer dump-autoload
這時運行 php artisan db:seed
查看數據表:
剛纔新建的用戶已經存在了,這時進行登錄,發現可以成功訪問。
3、實現前臺用戶的稍複雜登錄
我們在前面設置了 active 欄位,用來驗證用戶是否允許登錄,但是,目前 active 欄位並沒有進行驗證,接下來就要驗證 active 欄位。 (1)修改 users 表中的 active 欄位為 0。 (2)修改 vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php 文件
和 attempt 方法中的:
(3)在 resources/lang 文件夾 en 文件夾中,打開 auth.php,在數組中添加:
'active' => 'This account is not allowed to login.'
(4)修改 blade 模板文件:
然後再次使用之前的賬號密碼登錄,發現會提示錯誤信息:
4、實現後臺用戶登錄(前後臺分離登錄)
出於安全考慮,後臺用戶不允許記住密碼,因此的前臺使用不同的登錄界面。 由於是兩個表實現,所以操作的資料庫也不一樣。 (1)添加後臺用戶,與添加前臺用戶相同,生成並運行 seeder (2)添加 Admin 模型(註意模型的繼承和 Trait 的使用) (3)添加路由和控制器
併在控制器中添加 index 方法
在上面可以看到,我們使用的中間件還是 auth ,這就會和前臺登錄一樣一樣的了,可現在是後臺登錄呀。
(4)自定義中間件(預設中間件的位置在 app\Http\Middlewares)php artisan make:middleware AuthAdmin
修改內容為:
php artisan make:middleware GuestAdmin
修改內容為:
(5)打開 Http 目錄下的 Kernel.php 文件,在 routeMiddleware 中添加:
現在修改之前的路由:
現在如果直接訪問 127.0.0.1:8000/admin 會提示 LoginController 不存在,我們複製 Auth 文件夾下的 LoginController 到 Controllers 目錄,也可以新建。
修改裡面的內容為:
新建視圖文件 login.blade.php,複製 auth 文件夾下的 login.blade.php 到 當前視圖文件,去掉 checkbox,修改提交地址為 route('admin.login'),保存。
然後。。。就 OK 了。二、一個表實現(同一個表,使用欄位進行區分)
在兩個表實現的基礎上,我們修改以下內容: 1、在 users 表中添加 type 欄位(0 為前臺用戶,1 為後臺用戶)。 2、添加用戶信息:
3、修改 route 文件
4、修改 LoginController.php 文件
刪除 guard 方法,添加 credentials 方法
目前來說已經基本實現了單表的前後臺登錄,但是現在是有 bug 的。
如果我在訪問 localhost:8000 時登錄了 user 用戶,這時直接在瀏覽器地址欄中輸入 localhost:8000/admin 也是可以訪問到後臺的,但是 user 用戶是沒有許可權的,這樣就出現了很大的安全隱患,我是這樣想的,在中間件中多加一條判斷,看用戶是否有進入後臺的許可權,如果沒有就返回前一頁,有就可以訪問。
在視圖層中顯示錯誤信息。
打開 layout/app.blade.php,在文件末尾處添加 JavaScript 代碼:
OVER!