一、后台Admin模块

后台管理是有管理员的,甚至超级管理员,所以在设计数据表的时候,就会有2个方案,一个方案是共用users数据表,添加is_admin,is_superAdmin字段来进行验证,或者将用户编到不同的组里面,另一个方案是,单独创建admins数据表来进行管理(这样前台和后台是两个事件,前台用户是没有机会操作后台相关功能的,也就是完全隔离了)

我采用第二种(实习快四个月了,跟了2个完整项目是这样~)

我在上一篇说到,我使用的是laravel-module,所以相关初始配置不再赘述。

使用artisan hd:module Admin后,可访问后台界面partTime.com/admin

二、动态分层管理后台菜单

三、创建Guard守卫实现前后台账号分离

1. 守卫Guard配置

请仔细看下面代码中的注释~

 <?php

 return [

     /*
|--------------------------------------------------------------------------
| Authentication Defaults
|--------------------------------------------------------------------------
|
| This option controls the default authentication "guard" and password
| reset options for your application. You may change these defaults
| as required, but they're a perfect start for most applications.
| defaults:默认使用web守卫者
| guard:守卫者,守卫web(也就是前台的所有操作)
| passwords:守卫者对应的数据表,也即是根据哪一张来进行守卫
|
*/ 'defaults' => [
'guard' => 'web',
'passwords' => 'users',
], /*
|--------------------------------------------------------------------------
| Authentication Guards
|--------------------------------------------------------------------------
|
| Next, you may define every authentication guard for your application.
| Of course, a great default configuration has been defined for you
| here which uses session storage and the Eloquent user provider.
|
| All authentication drivers have a user provider. This defines how the
| users are actually retrieved out of your database or other storage
| mechanisms used by this application to persist your user's data.
|
| Supported: "session", "token"
| 这部分是定义守卫者
| driver:通过什么方式来检索用户,要么session会话,要么token令牌
| provider:对应的数据表
|
*/ 'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
], 'api' => [
'driver' => 'token',
'provider' => 'users',
],
], /*
|--------------------------------------------------------------------------
| User Providers
|--------------------------------------------------------------------------
|
| All authentication drivers have a user provider. This defines how the
| users are actually retrieved out of your database or other storage
| mechanisms used by this application to persist your user's data.
|
| If you have multiple user tables or models you may configure multiple
| sources which represent each model / table. These sources may then
| be assigned to any extra authentication guards you have defined.
|
| Supported: "database", "eloquent"
| 因为Laravel对数据表的操作都是通过模型Model,所以需要再此定义
| Admin模型定义:php artisan make:model Admin -fm(f代表模型工厂,m代表数据迁移表) 这种方式很方便,比用一个一个去创建了~~不使用此方法的话,万一表定义错了,你还得告诉模型你使用的是拿一张表
|
*/ 'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
], // 'users' => [make
// 'driver' => 'database',
// 'table' => 'users',
// ],
], /*
|--------------------------------------------------------------------------
| Resetting Passwords
|--------------------------------------------------------------------------
|
| You may specify multiple password reset configurations if you have more
| than one user table or model in the application and you want to have
| separate password reset settings based on the specific user types.
|
| The expire time is the number of minutes that the reset token should be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
*/ 'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
], ];

auth.php

注意:

此时创建出来的Admin.php如下,其实是不完整的哟,往下看~

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Admin extends Model
{
//
}

2. View、Controller的配置

View可以使用和前台一样的界面,也可以自己修改界面,无非就是个样式问题

Controller和前台一样

所以如果一样的话,直接复制粘贴,修改控制器的namespace就好啦~

如果你使用了不同UI,却发现界面不对的话,在LoginController添加以下方法

// 这是指定显示哪一个界面
public function showLoginForm()
{
return view('admin::auth.login');
}

3. 路由配置

方法一:

 // middleware中间件
// prefix:前缀(可以使用artisan route:list查看)比如:前台登陆:http://parttime.com/login,后台登陆:http://parttime.com/admin/login(其中的admin就是属性prefix指定的)
Route::group(
['middleware' => 'web', 'prefix' => 'admin', 'namespace' => 'Modules\Admin\Http\Controllers'],
function () {
Auth::routes();
}
);

如果用这种方式的话,那么form表单的action属性就得写成action="/admin/login"

方法二:

 Route::group(
['middleware' => 'web', 'prefix' => 'admin', 'namespace' => 'Modules\Admin\Http\Controllers'],
function () {
Route::name('admin.')->group(
function () {
Auth::routes();
}
);
}
);

如果用这种方式的话,那么form表单的action属性就得写成action="{{route('admin.login')}}"

4. 错误

错误一:邮箱不能为空

LoginController中use了一个AuthenticatesUsers,它里面有那个方法username()是指定验证的用户名是谁,默认是email,我们可以对它进行重写

public function username()
{
return 'name';// 或者你想验证的属性
}

错误二:用户名密码错误

为了方便测试,我们将admins表中的第一条数据进行了修改,因此排除Factory、AdminSeeder的错误

其实AuthenticatesUsers还有一个guard()方法,它指定使用哪一个守卫者,不传参默认使用web,所以需要对它进行重写(也就是告诉网页,此时的url是谁保护的)

protected function guard()
{
return \Auth::guard('admin');
}

错误三:好多英文~

截至目前,Admin.php中只是继承了Model,它只是实现了对表的一些操作,比如增删改查等等,并没有守卫者

那我们来看一下系统默认的User.php模型是怎么样的

 <?php

 namespace App;

 use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable
{
use Notifiable; /**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
]; /**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}

User.php

我们可以模仿它来改造我们的Admin.php模型

 <?php

 namespace App;

 use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable; class Admin extends Authenticatable
{
use Notifiable; //
}

搞定,后台也可以登陆啦~ 然后你又会发现一个问题,为啥跳转到了前台登陆界面

错误四:跳转错误

其实这里暗藏了两个问题:1.为什么跳转错误(肯定是和后台相关的一些配置出了问题)2.为什么跳转到的是前台的登陆界面

咱们先解决第2个问题:

这是前台路由配置,Laravel有中间件机制,当前台用户没有登陆的时候,他访问了网址,就会自动跳转到登陆界面,而控制这个Controller是前台的HomeController.php

 <?php

 /*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/ // 主页面
Route::get(
'/',
function () {
return view('welcome');
}
); // 前台登陆、注册、找回密码
Auth::routes(); Route::get('/home', 'HomeController@index')->name('home');

web.php

 <?php

 namespace App\Http\Controllers;

 class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
} /**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('home');
}
}

HomeController.php

再解决第一个问题:

很简单,再Admin模块的LoginController.php中,有一个$redirectTo属性就是控制跳转的~

补充:

无论前台还是后台,用户登陆成功了以后,再通过地址栏访问登陆界面是不应该出现它的,所以中间件的魅力就可以凸显~

四、中间件设置前后台跳转不同路由

中间件有Laravel已经配置好的(app/Http/Kernel.php),也可以自己自定义

前后台的LoginController.php的构造方法如下

 public function __construct()
{
$this->middleware('guest')->except('logout');// except:指定的方法或方法组不进行验证
}

guest中间件是对游客的限制,那么就会有一个问题:如何指定这个有可能即将登陆的游客是什么角色呢,是前台用户,还是后台管理员?所以guard守卫者再次派上用场

middleware('guest:admin')当不指定admin的时候默认采用web(前台)守卫者,否则采用指定的守卫者(这里是admin守卫者)

那么又产生一个问题:我验证成功了,如何针对不同角色的用户实现不同的跳转呢?

下面是guest中间件所对应的类实现的方法(暂时忽略$next,这个和设计模式有关,现在还用不到)

逻辑很简单,判断是否有传进来的守卫者,没有就用默认的web,然后进行跳转/home(问题就在这里:不管前台还是后台都是跳转/home,显然是不对的,因此需要对其进行修改)

 <?php

 namespace App\Http\Middleware;

 use Closure;
use Illuminate\Support\Facades\Auth; class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/home');
} return $next($request);
}
}

修改后:

 <?php

 namespace App\Http\Middleware;

 use Closure;
use Illuminate\Support\Facades\Auth; class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
*
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
// 可以自行决定跳转到哪里~
return redirect($guard == 'admin' ? '/admin' : '/home');
} return $next($request);
}
}
AuthenticatesUsers

Laravel系列之CMS系统学习 — 角色、权限配置【1】的更多相关文章

  1. Laravel系列之CMS系统学习 — 角色、权限配置【2】

    一.RBAC分析 基于角色的权限访问控制(Role-Based Access Control),这里存在这么几个玩意儿:角色.权限,用户 表:roles.permissions.role_has_pe ...

  2. Laravel系列教程一:安装及环境配置

    免费视频教程地址https://laravist.com/series/laravel-5-basic 最近在SF上面看到越来越多的Laravel相关的问题,而作为一个Laravel的脑残粉,本来打算 ...

  3. 一百一十一:CMS系统之后端权限验证功能

    实现方式 使用装饰器的形式,将权限判断加在视图上 声明接口需要什么权限,用户访问接口的时候,判断用户是否有此权限 权限判断,接收权限 def permission_required(permissio ...

  4. 一百零八:CMS系统之封装权限判断功能

    在用户模型下定义属性和方法,用于判断用户的权限 @propertydef permissions(self): """ 返回用户拥有的所有权限 ""& ...

  5. STM32入门系列-STM32时钟系统,时钟使能配置函数

    之前的推文中说到,当使用一个外设时,必须先使能它的时钟.怎么通过库函数使能时钟呢?如需了解寄存器配置时钟,可以参考<STM32F10x中文参考手册>"复位和时钟控制(RCC)&q ...

  6. STM32入门系列-STM32时钟系统,时钟初始化配置函数

    在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main.那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使 ...

  7. Laravel系列 Web

    一.Homestead准备 上一篇文章已经对它的配置进行了说明,下面对Homestead.yaml进行说明 --- ip: "192.168.10.10" memory: 2048 ...

  8. Dubbo -- 系统学习 笔记 -- 配置参考手册

    Dubbo -- 系统学习 笔记 -- 目录 配置参考手册 <dubbo:service/> <dubbo:reference/> <dubbo:protocol/> ...

  9. Dubbo -- 系统学习 笔记 -- 配置

    Dubbo -- 系统学习 笔记 -- 目录 配置 Xml配置 属性配置 注解配置 API配置 配置 Xml配置 配置项说明 :详细配置项,请参见:配置参考手册 API使用说明 : 如果不想使用Spr ...

随机推荐

  1. Oauth服务端协议开发

    授权流程图 AS : Authorization Server (权限服务器) RS : Resource Server (资源服务器) Client :Client RS(资源服务器)流程图 以上仅 ...

  2. Node.js资料

    http://developer.51cto.com/art/201109/290443.htmhttp://www.nodebeginner.org/index-zh-cn.html node 各种 ...

  3. maven课程 项目管理利器-maven 3-5 maven生命周期和插件 4星

    本节重点: maven插件的使用 本节主要内容: 1 maven生命周期 2 maven插件的使用 3 零散知识点 1 maven生命周期  maven生命周期主要有三个: a clean 清理项目 ...

  4. elasticsearch结构化查询过滤语句-----4

    1.之前三节讲述的都是索引结构及内容填充的部分,既然添加了数据那我们的目的无非就是增产改查crudp,我先来讲讲查询-----结构化查询 我们看上图截图两种方式: 1)第一种,在索引index5类型s ...

  5. IDEA配置 tomcat server

  6. python模块详解 shelve

    shelve模块是一个简单的k,v 将内存数据通过文件持久化的模块,可以持久化任何pickle可以支持的python数据.简单的说对 pickle的更上一层的封装. 写文件 import shelve ...

  7. Struts2_模块包含

    <include file="login.xml"/> 包含其他的模块. 项目开发中,分模块协调开发有用. 链接: http://pan.baidu.com/s/1bo ...

  8. [javascript]什么是闭包?

    http://www.zcfy.cc/article/master-the-javascript-interview-what-is-a-closure-2127.html

  9. struts2.3.4.1转换成eclipse项目的过程

    1.在本地安装配置maven. 1.1.从maven官网下载,官网地址:http://maven.apache.org/download.cgi 1.2.配置maven环境变量       例如,我的 ...

  10. java集合框架——Set

    一.Set概述 Set集合的特点是元素不允许重复,而且是无序的(添加和取出的顺序不一致). Set接口中的方法和Collection接口中的方法几乎相同,略. Set接口下常用的两个类:HashSet ...