Laravel系列之CMS系统学习 — 角色、权限配置【1】
一、后台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】的更多相关文章
- Laravel系列之CMS系统学习 — 角色、权限配置【2】
一.RBAC分析 基于角色的权限访问控制(Role-Based Access Control),这里存在这么几个玩意儿:角色.权限,用户 表:roles.permissions.role_has_pe ...
- Laravel系列教程一:安装及环境配置
免费视频教程地址https://laravist.com/series/laravel-5-basic 最近在SF上面看到越来越多的Laravel相关的问题,而作为一个Laravel的脑残粉,本来打算 ...
- 一百一十一:CMS系统之后端权限验证功能
实现方式 使用装饰器的形式,将权限判断加在视图上 声明接口需要什么权限,用户访问接口的时候,判断用户是否有此权限 权限判断,接收权限 def permission_required(permissio ...
- 一百零八:CMS系统之封装权限判断功能
在用户模型下定义属性和方法,用于判断用户的权限 @propertydef permissions(self): """ 返回用户拥有的所有权限 ""& ...
- STM32入门系列-STM32时钟系统,时钟使能配置函数
之前的推文中说到,当使用一个外设时,必须先使能它的时钟.怎么通过库函数使能时钟呢?如需了解寄存器配置时钟,可以参考<STM32F10x中文参考手册>"复位和时钟控制(RCC)&q ...
- STM32入门系列-STM32时钟系统,时钟初始化配置函数
在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main.那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使 ...
- Laravel系列 Web
一.Homestead准备 上一篇文章已经对它的配置进行了说明,下面对Homestead.yaml进行说明 --- ip: "192.168.10.10" memory: 2048 ...
- Dubbo -- 系统学习 笔记 -- 配置参考手册
Dubbo -- 系统学习 笔记 -- 目录 配置参考手册 <dubbo:service/> <dubbo:reference/> <dubbo:protocol/> ...
- Dubbo -- 系统学习 笔记 -- 配置
Dubbo -- 系统学习 笔记 -- 目录 配置 Xml配置 属性配置 注解配置 API配置 配置 Xml配置 配置项说明 :详细配置项,请参见:配置参考手册 API使用说明 : 如果不想使用Spr ...
随机推荐
- MySQL的btree索引和hash索引
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...
- Hibernate课程 初探多对多映射2-2 创建持久化类和映射文件
生成实体类 和 cfg.xml配置 cfg.xml 参照一对多映射 实体类如下: Project 类 package com.ddwei.entity; import java.util.HashSe ...
- BZOJ3329: Xorequ(二进制数位dp 矩阵快速幂)
题意 题目链接 Sol 挺套路的一道题 首先把式子移一下项 \(x \oplus 2x = 3x\) 有一件显然的事情:\(a \oplus b \leqslant c\) 又因为\(a \oplus ...
- Android开发由eclipse转Android Studio中一些常见出错问题解决方法
1.给一个Activity添加了一个Dialog主题,结果出现了下面的问题,在eclipse却没有出错 <activity android:name=".DialogActivity& ...
- linux服务器tomcat启动时,不能加载项目
---恢复内容开始--- 问题描述:tomcat启动时候,能够成功启动但是项目不能加载,查看catalina.out后出现以下的错误 due to a StackOverflowError. Poss ...
- SharePoint 2010 究竟需要占用多少服务器资源?
SharePoint 安装目录(即SharePoint Root)大约 300M 磁盘空间. SharePoint Config 数据库,60M. Admin Center 数据库,100M. 默认安 ...
- eclipse 上使用tomcat 启动项目,项目目录下无.class 文件
摘要:在使用eclipse 启动taomcat时,项目报错,但将项目打成war包单独部署到tomcat时,则项目正常,通过对比两次部署文件发现,从eclipse直接启动tomcat时,部署到tomca ...
- mysql : 修改数据库权限
解决步骤 第一步,点击用户 注意!!! 编辑权限,在我们设置权限之前,我们需要先重新加载才能生效, 如果不用编辑的话,直接按重新载入编辑,这个相当于保存. 中文意思(注意看那段话) 第二步 选择要处理 ...
- ubuntu linux double tab
在terminal中,输入部分指令,再按两下Tab键,可以显示以相关的指令
- 如何查看某个用户指定时间段的ABAP开发记录
输入用户名和想查询的时间段: 执行得到结果.双击可查看具体代码: 工具源代码: REPORT tool_dev_history. PARAMETERS: name TYPE usr02-bname O ...