laravel 5.5入门系列——10

laravel实战使用Auth系统

  • laravel实战使用Auth系统

    • 过滤未登陆操作

    • 使用授权策略限定操作权限

    • 先写一个授权策略方法UserPolicyphp

    • 接着在appProvidersAuthServiceProviderphp里指定授权策略因为用的就是UserPolicyphp因此不用再添加

    • 最后在视图文件中使用can方法

    • 先写授权方法

    • 为模型指定授权策略

    • 使用authorize做权限认证

    • 使用Blade模板的授权功能


过滤未登陆操作

因为对于某一个用户来说,有一些操作应该是登陆之后才能进行的,比如修改信息,查看个人主页,提交信息等等。利用laravel自带的Auth很容易做到过滤一些方法,最佳实践应是使用except来进行黑名单过滤: 
路径: App/Http/Controllers/Userscontroller

public function __construct()
    {
        $this->middleware('auth',[            'except'=>['create','store']
        ]);
    }123456

除了create和store方法,其余的操作都得在登录后完成。


使用授权策略限定操作权限

首先生成一个管理用户权限的授权策略,生成的授权文件路径是app/Policies

php artisan make:policy UserPolicy1

首先明确一下,要进行权限管理有两个大步骤 
1. 在对应的权限文件中写好需要的授权方法 
2. 在AuthServiceProvider类中为对应的模型指定刚刚写好的授权方法 
3. 在控制器中相应的方法中使用授权策略


先写授权方法:

app/Policies/UserPolicy.php

<?phpnamespace App\Policies;use Illuminate\Auth\Access\HandlesAuthorization;use App\Models\User;class UserPolicy{
    use HandlesAuthorization;    public function verify(User $currentUser, User $user)
    {
        return $currentUser->id === $user->id;
    }
}12345678910111213141516

第一个参数是当前用户,第二个参数是用来验证的用户。使用update授权方法时,不需要传入$currentUser,框架会自动传入这个参数。update授权方法的意思就是,如果当前登陆用户和想要验证的用户的id一摸一样,那么授权通过,否则会抛出403错误.


为模型指定授权策略

app/Providers/AuthServiceProvider.php

<?php
namespace App\Providers;
.
,
.
class AuthServiceProvider extends ServiceProvider
{    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [        'App\Model' => 'App\Policies\ModelPolicy',
        \App\Models\User::class  => \App\Policies\UserPolicy::class,
    ];
    .
    .
    .
}123456789101112131415161718192021

指定方法即如示例代码一样,在$policies属性中添加keyModel类,valuePolicy类的键值对即可。


使用authorize做权限认证

代码如下:UsersController.php

 public function show(User $user)
    {        $this->authorize('verify',$user);        $courses=$user->courses()->paginate();
        if($user->is_ta) return view('users.tahome',compact('user','courses'));
        return view('users.sthome',compact('user','courses'));
    }1234567

此时在控制器中的show方法中使用authorize授权,接受两个参数,第一个是授权策略,第二个是需授权验证的数据。这里如前所述,省略了$currentuser。因为框架会自动帮你补充进去。如果满足verify的授权策略,那么可以执行show方法,否则会抛出错误。


使用Blade模板的授权功能

首先某一个模块只想让特殊身份的用户看到,一般用户看不到。那么用视图的Blade引擎的@can功能就很好实现这个功能。 
TA-Project中提交课堂信息绑定的功能只有助教能做,所以那个表单只能给助教看到。

1. 先写一个授权策略方法:UserPolicy.php
 public function bind_course(User $currentUser)
    {
        return $currentUser->is_ta;
    }1234
2. 接着在app/Providers/AuthServiceProvider.php里指定授权策略(因为用的就是UserPolicy.php因此不用再添加)
<?php
namespace App\Providers;
.
,
.
class AuthServiceProvider extends ServiceProvider
{    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [        'App\Model' => 'App\Policies\ModelPolicy',
        \App\Models\User::class  => \App\Policies\UserPolicy::class,
    ];
    .
    .
    .
}123456789101112131415161718192021
3. 最后在视图文件中使用@can方法:
 @can('bind_course', $user)      <div class="row">
            <div class="col-lg-offset-1 col-lg-10 col-md-offset-1 col-md-10 col-sm-offset-1 col-sm-10 col-xs-12">
              <div class="title" >
                 <span>修改课堂信息</span>
              </div>
                <br/><br/>
            <div class="col-lg-offset-2 col-lg-8 col-md-offset-1 col-md-10 col-sm-offset-1 col-sm-10 col-xs-12">
                <form action="{{route('courses.store',['user'=>Auth::user()])}}" method="POST" role="form">
                    {{csrf_field()}}                    <div class="input-group">
                        <span class="input-group-addon">&nbsp;&nbsp;课堂号&nbsp;&nbsp;</span>
                        <input name="course_id" type="text" class="form-control" placeholder="请输入课堂号" value="{{$user->ta_course}}">
                    </div>
                    <br>
                    <div class="input-group">
                        <span class="input-group-addon">课程名称</span>
                        <input name="course_name" type="text" class="form-control" placeholder="请输入课程名称" value="{{$user->assistant_course()->course_name}}">
                    </div>
                    <br>
                    <div class="input-group">
                        <span class="input-group-addon">任课教师</span>
                        <input name="teacher" type="text" class="form-control" placeholder="请输入任课教师" value="{{$user->assistant_course()->teacher}}">
                    </div>
                    <br>
                    <div>
                         <button class="btn btn-primary" type="submit">
                         &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;提交课堂信息&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                         </button>
                    </div>
                </form>
        </div>
          </div>
        </div>
 @endcan1234567891011121314151617181920212223242526272829303132333435363738

吼啦,进一步验证身份啥的想怎么写就怎么写吧。