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

一、后台Admin模块

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

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

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

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

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

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

1. 守卫Guard配置

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

  1 <?php
  2
  3 return [
  4
  5     /*
  6     |--------------------------------------------------------------------------
  7     | Authentication Defaults
  8     |--------------------------------------------------------------------------
  9     |
 10     | This option controls the default authentication "guard" and password
 11     | reset options for your application. You may change these defaults
 12     | as required, but they‘re a perfect start for most applications.
 13     | defaults:默认使用web守卫者
 14     | guard:守卫者,守卫web(也就是前台的所有操作)
 15     | passwords:守卫者对应的数据表,也即是根据哪一张来进行守卫
 16     |
 17     */
 18
 19     ‘defaults‘ => [
 20         ‘guard‘     => ‘web‘,
 21         ‘passwords‘ => ‘users‘,
 22     ],
 23
 24     /*
 25     |--------------------------------------------------------------------------
 26     | Authentication Guards
 27     |--------------------------------------------------------------------------
 28     |
 29     | Next, you may define every authentication guard for your application.
 30     | Of course, a great default configuration has been defined for you
 31     | here which uses session storage and the Eloquent user provider.
 32     |
 33     | All authentication drivers have a user provider. This defines how the
 34     | users are actually retrieved out of your database or other storage
 35     | mechanisms used by this application to persist your user‘s data.
 36     |
 37     | Supported: "session", "token"
 38     | 这部分是定义守卫者
 39     | driver:通过什么方式来检索用户,要么session会话,要么token令牌
 40     | provider:对应的数据表
 41     |
 42     */
 43
 44     ‘guards‘ => [
 45         ‘web‘   => [
 46             ‘driver‘   => ‘session‘,
 47             ‘provider‘ => ‘users‘,
 48         ],
 49         ‘admin‘ => [
 50             ‘driver‘   => ‘session‘,
 51             ‘provider‘ => ‘admins‘,
 52         ],
 53
 54         ‘api‘ => [
 55             ‘driver‘   => ‘token‘,
 56             ‘provider‘ => ‘users‘,
 57         ],
 58     ],
 59
 60     /*
 61     |--------------------------------------------------------------------------
 62     | User Providers
 63     |--------------------------------------------------------------------------
 64     |
 65     | All authentication drivers have a user provider. This defines how the
 66     | users are actually retrieved out of your database or other storage
 67     | mechanisms used by this application to persist your user‘s data.
 68     |
 69     | If you have multiple user tables or models you may configure multiple
 70     | sources which represent each model / table. These sources may then
 71     | be assigned to any extra authentication guards you have defined.
 72     |
 73     | Supported: "database", "eloquent"
 74     | 因为Laravel对数据表的操作都是通过模型Model,所以需要再此定义
 75     | Admin模型定义:php artisan make:model Admin -fm(f代表模型工厂,m代表数据迁移表) 这种方式很方便,比用一个一个去创建了~~不使用此方法的话,万一表定义错了,你还得告诉模型你使用的是拿一张表
 76     |
 77     */
 78
 79     ‘providers‘ => [
 80         ‘users‘  => [
 81             ‘driver‘ => ‘eloquent‘,
 82             ‘model‘  => App\User::class,
 83         ],
 84         ‘admins‘ => [
 85             ‘driver‘ => ‘eloquent‘,
 86             ‘model‘  => App\Admin::class,
 87         ],
 88
 89         // ‘users‘ => [make
 90         //     ‘driver‘ => ‘database‘,
 91         //     ‘table‘ => ‘users‘,
 92         // ],
 93     ],
 94
 95     /*
 96     |--------------------------------------------------------------------------
 97     | Resetting Passwords
 98     |--------------------------------------------------------------------------
 99     |
100     | You may specify multiple password reset configurations if you have more
101     | than one user table or model in the application and you want to have
102     | separate password reset settings based on the specific user types.
103     |
104     | The expire time is the number of minutes that the reset token should be
105     | considered valid. This security feature keeps tokens short-lived so
106     | they have less time to be guessed. You may change this as needed.
107     |
108     */
109
110     ‘passwords‘ => [
111         ‘users‘ => [
112             ‘provider‘ => ‘users‘,
113             ‘table‘    => ‘password_resets‘,
114             ‘expire‘   => 60,
115         ],
116     ],
117
118 ];

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. 路由配置

方法一:

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

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

方法二:

 1 Route::group(
 2     [‘middleware‘ => ‘web‘, ‘prefix‘ => ‘admin‘, ‘namespace‘ => ‘Modules\Admin\Http\Controllers‘],
 3     function () {
 4         Route::name(‘admin.‘)->group(
 5             function () {
 6                 Auth::routes();
 7             }
 8         );
 9     }
10 );

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

4. 两个错误

错误一:邮箱不能为空

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

public function username()
{
    return ‘name‘;
}

错误二:用户名密码错误

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

其实AuthenticatesUsers还有一个guard()方法,它指定使用哪一个守卫者,不传参默认使用web,所以需要对它进行重写

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

错误三:好多英文~(还记得三、1的注意嘛)

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

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

 1 <?php
 2
 3 namespace App;
 4
 5 use Illuminate\Notifications\Notifiable;
 6 use Illuminate\Foundation\Auth\User as Authenticatable;
 7
 8 class User extends Authenticatable
 9 {
10     use Notifiable;
11
12     /**
13      * The attributes that are mass assignable.
14      *
15      * @var array
16      */
17     protected $fillable = [
18         ‘name‘, ‘email‘, ‘password‘,
19     ];
20
21     /**
22      * The attributes that should be hidden for arrays.
23      *
24      * @var array
25      */
26     protected $hidden = [
27         ‘password‘, ‘remember_token‘,
28     ];
29 }

User.php

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

 1 <?php
 2
 3 namespace App;
 4
 5 use Illuminate\Notifications\Notifiable;
 6 use Illuminate\Foundation\Auth\User as Authenticatable;
 7
 8 class Admin extends Authenticatable
 9 {
10     use Notifiable;
11
12     //
13 }

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

错误四:跳转错误

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

咱们先解决第2个问题:

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

 1 <?php
 2
 3 /*
 4 |--------------------------------------------------------------------------
 5 | Web Routes
 6 |--------------------------------------------------------------------------
 7 |
 8 | Here is where you can register web routes for your application. These
 9 | routes are loaded by the RouteServiceProvider within a group which
10 | contains the "web" middleware group. Now create something great!
11 |
12 */
13
14 // 主页面
15 Route::get(
16     ‘/‘,
17     function () {
18         return view(‘welcome‘);
19     }
20 );
21
22 // 前台登陆、注册、找回密码
23 Auth::routes();
24
25 Route::get(‘/home‘, ‘[email protected]‘)->name(‘home‘);

web.php

 1 <?php
 2
 3 namespace App\Http\Controllers;
 4
 5 class HomeController extends Controller
 6 {
 7     /**
 8      * Create a new controller instance.
 9      *
10      * @return void
11      */
12     public function __construct()
13     {
14         $this->middleware(‘auth‘);
15     }
16
17     /**
18      * Show the application dashboard.
19      *
20      * @return \Illuminate\Http\Response
21      */
22     public function index()
23     {
24         return view(‘home‘);
25     }
26 }

HomeController.php

再解决第一个问题:

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

补充:

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

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

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

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

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

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

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

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

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

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

 1 <?php
 2
 3 namespace App\Http\Middleware;
 4
 5 use Closure;
 6 use Illuminate\Support\Facades\Auth;
 7
 8 class RedirectIfAuthenticated
 9 {
10     /**
11      * Handle an incoming request.
12      *
13      * @param  \Illuminate\Http\Request  $request
14      * @param  \Closure  $next
15      * @param  string|null  $guard
16      * @return mixed
17      */
18     public function handle($request, Closure $next, $guard = null)
19     {
20         if (Auth::guard($guard)->check()) {
21             return redirect(‘/home‘);
22         }
23
24         return $next($request);
25     }
26 }

修改后:

 1 <?php
 2
 3 namespace App\Http\Middleware;
 4
 5 use Closure;
 6 use Illuminate\Support\Facades\Auth;
 7
 8 class RedirectIfAuthenticated
 9 {
10     /**
11      * Handle an incoming request.
12      *
13      * @param  \Illuminate\Http\Request $request
14      * @param  \Closure $next
15      * @param  string|null $guard
16      *
17      * @return mixed
18      */
19     public function handle($request, Closure $next, $guard = null)
20     {
21         if (Auth::guard($guard)->check()) {
22             // 可以自行决定跳转到哪里~
23             return redirect($guard == ‘admin‘ ? ‘/admin‘ : ‘/home‘);
24         }
25
26         return $next($request);
27     }
28 }
AuthenticatesUsers

原文地址:https://www.cnblogs.com/ltqTest/p/10040832.html

时间: 2024-11-05 16:05:46

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

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

一.RBAC分析 基于角色的权限访问控制(Role-Based Access Control),这里存在这么几个玩意儿:角色.权限,用户 表:roles.permissions.role_has_permissions.model_has_roles.model_has_permissions(最后两张表可以看4.1有解释) 明确:用户属于什么角色,那么角色拥有什么权限,用户自然拥有 然后配置,就戳这里(后面就不添加了)~ 二.角色的增删改查 这个就很普通的功能了,略??? 但是有一些需要注意的

SSH系列:(16)角色-权限管理(后台)

1.角色和权限的关系 系统中可以存在多个角色,每个角色可以自由的组合系统定义的权限集合,即角色和权限的关系是多对多的关系.为了保存这种多对多关系,需要一个"角色权限表"来保存. 角色和权限的多对多关系,可以进行拆分:"角色"与"角色权限"的关系."权限"和"角色权限"的关系."角色"与"角色权限"的关系是一对多的关系:而"权限"与"角色权

SSH系列:(17)角色-权限管理(前台JSP)

1.listUI.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib uri="/struts-tags" prefix="s" %> <html> <head>     <%@include file="/common/header.jsp"%&

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

免费视频教程地址https://laravist.com/series/laravel-5-basic 最近在SF上面看到越来越多的Laravel相关的问题,而作为一个Laravel的脑残粉,本来打算有机会录视频教程放出来的,不过这个计划貌似由于某些原因必须得推迟一段时间,所以现在先把文章的系列教程写出来吧. 首先需要说明的是,这个教程对于完全没有上手Laravel的人来说,我尽量将一些概念和重点说清楚,不过你也不需要担心这需要花很多时间来跟着这个教程学习Laravel,我相信,如果你认认真真跟

Oracle基础学习5-- Oracle权限之”角色”

任何与权限相关的东西都少不了"角色"的概念,Java如此,.Net如此,Oracle当然也不例外. 角色其实就是权限的集合,将多个权限打包到一个角色中,这样每个角色有特定的权限.当需要给某个对象赋予某种权限时,就找到具有相应权限的角色,然后将它加到这个集合当中.下面就简单看看Oracle中角色的运用. 上篇文章讲到,为了给多用户授予各种权限,我们用到了"权限传递"来代替给用户们一个个授权,简化了授权过程.但这种方式较之用"角色"方式授权还是有很多

sharepoint 2016 学习系列篇(15)-自定义列表应用篇-(4)数据权限配置

当数据已经录入到列表中之后,接下来,朋友们可能会想知道,有些数据,只想给某些用户看到,或者编辑,列表是否支持这样的操作. 大微软的sharepoint平台,对于用户的需求,可以说是考虑得很周全的,权限管理,当然也是不可能漏掉的,而且权限管理,还是sharepoint上一个非常突出的亮点,数据安全性管理的颗粒度,很完善.接下来,我们来看下,如何在sharepoint的自定义列表中,给数据配置不同的用户访问权限,这些当然也是不需要开发,就能实现的. 前面讲到,用户访问sharepoint平台网站的时

设计OA系统的用户-角色-权限分配

转载:http://www.cnblogs.com/jsping/archive/2013/01/23/2872972.html 设计OA系统的用户-角色-权限分配 一,前言  本文主要讲述在OA系统设计时用户——角色——权限的数据库设计,以便实现权限分配. 二,初步分析 用户通过UI登录系统时,把用户的用户名.密码传递给后台判断用户表中是否存在可用的用户信息,如果存在那么允许页面的跳转,并设置一些Session信息,当页面跳转时根据用户的Session信息获取用户的角色,进一步根据角色获取用户

角色权限系统的 一些概念

用一个功能模块来举例子.一.建立角色功能并做分配:1.如果现在要做一个员工管理的模块(即Resources),这个模块有三个功能,分别是:增加,修改,删除.给这三个功能各自分配一个ID,这个ID叫做功能代号:Emp_addEmp,Emp_deleteEmp,Emp_updateEmp.2.建立一个角色(Role),把上面的功能代码加到这个角色拥有的权限中,并保存到数据库中.角色包括系统管理员,测试人员等.3.建立一个员工的账号,并把一种或几种角色赋给这个员工.比如说这个员工既可以是公司管理人员,

Java I/O系统学习系列二:输入和输出

编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇文章:<<Java I/O系统学习系列一:File和RandomAccessFile>>中,我们讲到RandomAccessFile可以写入和读取文件,具备I/O功能,但是其只能针对文件,而I/O还涉及到很多其他场景比如网络.读取内存中的字符串等,所以Java类库中提供了一系列的类库来对其进行支持,也就是