热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

九、高效使用安全性和会话

九、高效使用安全性和会话在本章中,我们将介绍:加密和解密数据

九、高效使用安全性和会话

在本章中,我们将介绍:


  • 加密和解密数据

  • 散列密码和其他数据

  • 在表单中使用 CSRF 令牌和筛选器

  • 在表单中使用高级验证

  • 构建购物车

  • 使用 Redis 保存会话

  • 使用基本会话和 COOKIEs

  • 创建安全的应用编程接口服务器


简介

安全性是我们在构建 web 应用时需要考虑的最重要的事情之一,尤其是当我们处理敏感的用户信息时。Laravel 为我们提供了许多保护应用安全的方法。

在本章中,我们将研究各种方法来屏蔽敏感数据,如何保护我们的表单免受跨站点攻击,以及如何保护应用编程接口。我们还将看到如何使用会话来构建购物车,以及如何使用 Redis 来存储会话数据。

加密和解密数据

在编写处理敏感数据的应用时,我们可能经常想要加密存储在数据库中的任何数据。Laravel 为此提供了一个解决方案。

做好准备

对于这个配方,我们需要一个标准的 Laravel 安装,以及一个正确设置和配置的 MySQL 数据库。

怎么做...

这就是我们如何使用以下步骤完成配方的方法:


  1. app/config目录下,打开app.php文件,确认key为空

    php
    'key' => '',


  2. 在命令行中,转到应用的根目录,并使用以下命令生成新密钥:

    php
    php artisan key:generate


  3. 使用以下命令在数据库中创建一个表来保存我们的敏感信息:

    ```php
    CREATE TABLE accounts(
    id int(11) unsigned NOT NULL AUTO_INCREMENT,
    business varchar(255) DEFAULT NULL,
    total_revenue varchar(255) DEFAULT NULL,
    projected_revenue varchar(255) DEFAULT NULL,
    PRIMARY KEY (id))
    ENGINE=InnoDB DEFAULT CHARSET=utf8;

    ```


  4. 在我们的app/models目录中,通过输入以下代码创建一个名为Account.php的文件:

    ```php

    class Account extends Eloquent {
    protected $table = 'accounts';
    public $timestamps = false;
    public function setBusinessAttribute($business) {$this->attributes['business'] = Crypt::encrypt($business);
    }

    public function setTotalrevenueAttribute($total_revenue)
    {$this->attributes['total_revenue'] = Crypt::encrypt($total_revenue);
    }

    public functionsetProjectedrevenueAttribute($projected_revenue)
    {
    $this->attributes['projected_revenue'] = Crypt::encrypt($projected_revenue);
    }

    public function getBusinessAttribute()
    {
    return Crypt::decrypt($this->attributes['business'])
    }

    public function getTotalrevenueAttribute()
    {
    return number_format(Crypt::decrypt($this>attributes['total_revenue'])) ;
    }

    public function getProjectedrevenueAttribute()
    {
    return number_format(Crypt::decrypt($this>attributes['projected_revenue']));
    }
    }
    ```


  5. 在我们的routes.php文件中,通过添加以下代码来创建路线以查看和提交信息:

    ```php
    Route::get('accounts', function()
    {
    $accounts = Account::all();
    return View::make('accounts')->with('accounts', $accounts);
    });

    Route::post('accounts', function()
    {
    $account = new Account();
    $account->business = Input::get('business');
    $account->total_revenue = Input::get('total_revenue');
    $account->projected_revenue = Input::get('projected_revenue');
    $account->save();
    return Redirect::to('accounts');
    });
    ```


  6. 在我们的views目录中,创建一个名为accounts.php

    php






































    Business Total Revenue Projected Revenue
    business ?> $total_revenue ?> $projected_revenue ?>

    的文件



它是如何工作的...

我们从移除开始,这是 Laravel 附带的默认键。然后,我们使用artisan命令为我们生成一个新的密钥,它会自动保存在正确的文件中。artisan命令创建了一个相当强的密钥,所以我们不必担心自己想出一个。

为应用创建密钥后,请确保它不会被更改,因为如果您已经使用了一些加密,这会破坏您的应用。

然后我们建立一个数据库表来保存我们的敏感数据。在本例中,我们将存储企业名称及其一些财务数据。

我们的下一步是建立我们的模型,使用Eloquent模型。为了让事情变得简单一点,我们将在模型中使用 getters 和 setters,这样每当在我们的Account模型中设置一个值时,它将使用 Laravel Crypt::encrypt类自动加密。此外,为了从数据库中获取信息,我们的模型会自动为我们解密。

接下来,我们创建几条路线。第一条路线将显示一个添加信息的表单,以及显示数据库中已经保存的任何内容。下一条路线只是采用表单输入,并将其保存到我们的帐户表中的新行。添加信息后,我们将被重定向回帐户列表和表单页面,新数据将显示在页面底部。

然而,如果我们看看数据库本身,我们存储的信息是不可读的文本。这样,如果有人碰巧侵入了我们的数据库,他们就不会得到太多信息。

散列密码和其他数据

当我们将用户密码存储在数据库中时,通常会对其进行散列处理。这有助于防止任何未经授权访问数据库的人看到人们的密码。但是,我们可能还想隐藏用户的电子邮件地址或其他信息,因此没有人能够访问它们。我们可以使用 Laravel 的 Hash 轻松做到这一点。

做好准备

对于这个配方,我们需要一个标准的 Laravel 安装,以及一个正确设置和配置的 MySQL 数据库。

怎么做...

以下是这个食谱的步骤…


  1. 使用以下命令设置数据库表:

    ```php
    CREATE TABLE register (
    id int(10) unsigned NOT NULL AUTO_INCREMENT,
    username varchar(255) DEFAULT NULL,
    email char(60) DEFAULT NULL,
    password char(60) DEFAULT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB AUTO_INCREMENT=1

    ```


  2. views目录中,借助以下代码创建一个名为register.php的文件:

    php








    Register
















    Login
































    User Name Email Password
    username ?> email ?> password ?>



  3. 在我们的routes.php文件中,通过添加以下代码来创建我们的路线:

    ```php
    Route::get('register', function()
    {
    $users = DB::table('register')->get();
    return View::make('register')->with('users', $users);
    });

    Route::post('register', function()
    {
    $data = array(
    'username' => Input::get('username'),
    'email' => Hash::make(Input::get('email')),
    'password' => Hash::make(Input::get('password')));

    DB::table('register')->insert($data);

    return Redirect::to('register');
    });

    Route::post('login', function()
    {
    $user = DB::table('register')->where('username', '=',
    Input::get('username'))->first();
    if (!is_null($user) and Hash::check(Input::get('email'),
    $user->email) and Hash::check(Input::get('password'),
    $user->password)) {
    echo "Log in successful";
    } else {
    echo "Not able to login";
    }
    });

    ```



它是如何工作的...

为了开始这个方法,我们首先建立一个基本的用户表来保存用户名、电子邮件地址和密码。在这个例子中,用户名是唯一需要在常规文本中的东西。

在我们看来,我们将创建两个表单——一个用于注册,一个用于登录。为了显示数据库中的原始数据,我们还将显示所有用户的列表,以及他们的电子邮件和密码在表中的显示方式。

当我们提交注册表单时,信息会发布到我们的注册路径中,并放入一个数组中。对于电子邮件和密码,我们使用 Laravel 的Hash::make()函数进行散列。然后,我们将数组插入到我们的注册表中,并重定向回表单和列表页面。

重定向后,我们将看到添加了新行,我们的电子邮件和密码被散列,还有一个无法识别的字符串。有趣的是,通过散列的工作方式,我们可以使用完全相同的数据添加两行,散列将完全不同。

接下来,我们可以尝试使用用户名、电子邮件和密码登录。该路由将从我们的表中抓取一行与用户名相对应的内容,然后对输入值和数据库结果运行 Laravel 的Hash::check()函数。如果通过,则返回TRUE,我们可以继续应用。

还有更多...

为了在生产环境中使用这个配方,我们需要对输入进行一些验证。我们可能还想利用雄辩的表单 来让散列变得简单一点。

如果我们不需要隐藏用户的电子邮件,我们也可以使用 Laravel 在Auth::attempt()方法中构建的。更多相关信息可以在拉弗尔网站上找到:http://laravel.com/docs/security#authenticating-users

在表单中使用 CSRF 标记和过滤器

网络表单因黑客试图访问网站或用户信息而臭名昭著。为了让我们的表单更加安全,我们可以使用内置于 Laravel 中的跨站点请求伪造 ( CSRF )策略。这将停止用户会话之外的表单提交。

做好准备

对于这个食谱,我们需要一个标准的安装的 Laravel。

怎么做...

以下是完成该配方的步骤:


  1. routes.php文件中,通过下面给出的代码创建保存和处理表单的路径:

    ```php
    Route::get('cross-site', function()
    {
    return View::make('cross-site');
    });

    Route::post('cross-site', array('before' => 'csrf',function()
    {
    echo 'Token: ' . Session::token() . '
    ';
    dd(Input::all());
    }));
    ```


  2. filters.php文件中,确保csrf令牌的filter存在,如以下代码所示:

    php
    Route::filter('csrf', function()
    {
    if (Session::token() != Input::get('_token'))
    {
    throw new Illuminate\Session\TokenMismatchException;
    }
    });


  3. 在我们的views目录中,创建一个名为cross-site.php的文件,并添加两个表单进行测试,如下代码所示:

    php








    CSRF Login


    'cross-site', 'method' =>'post')) ?>











    CSRF Fake Login


    'cross-site', 'method' =>'post')) ?>










  4. 在浏览器中,转到http://{your-server}/cross-site(其中{your-server}是我们正在使用的服务器的名称),然后提交每个表单以查看结果。



它是如何工作的...

我们的第一步是为我们的 CSRF 形态创建路线。在表单中,我们只需要添加Form::token()功能;这将插入一个名为_token的隐藏字段,以及我们的用户会话 ID 的值。对于提交表单的路线,我们在过滤之前将csrf添加到我们的路线中。如果确定请求是伪造的,页面将返回一个服务器错误。

我们的下一个表单是一个例子,说明如果一个请求试图被伪造会发生什么。对于这个表单,我们不使用Form::token()函数,而是手动添加隐藏字段,并添加一些随机值。然后当我们提交表单时,页面会显示一条带有TokenMismatchException错误的失败消息。

还有更多...

使用Form::open()功能时,Laravel 也会自动生成一个csrf令牌,不需要手动添加。

在表单中使用高级验证

可能有些时候我们需要为验证我们的表单,这不是框架的一部分。这个食谱将告诉你如何建立一个定制的验证规则并应用它。

做好准备

对于这个食谱,我们需要一个标准安装的 Laravel。

怎么做...

以下是完成该配方的步骤:


  1. views目录中,使用以下代码创建一个名为valid.php的文件来保存我们的表单:

    php









    first('email') ?>
    first('captain') ?>



    Custom Validation


    'valid', 'method' => 'post'))?>

























  2. routes.php文件中,用创建我们的路线,代码如下:

    php
    Route::get('valid', function()
    {
    return View::make('valid');
    });
    Route::post('valid', function()
    {
    $rules = array('email' => 'required|email','captain' => 'required|check_three');
    $messages = array('check_three' => 'Thou shalt choose three captains. Nomore. No less. Three shalt be the number thou shaltchoose, and the number of the choosing shall bethree.',);
    $validation = Validator::make(Input::all(), $rules,$messages);
    if ($validation->fails())
    {
    return Redirect::to('valid')->withErrors($validation);
    }
    echo "Form is valid!";
    });


  3. 同样在routes.php文件中,创建我们的自定义验证,如以下代码所示:

    php
    Validator::extend('check_three', function($attribute,$value, $parameters)
    {
    return count($value) == 3;
    });



它是如何工作的...

首先,我们在视图中创建表单。我们要求一封有效的电子邮件,并且恰好选中三个复选框。由于没有针对三个复选框的 Laravel 验证方法,我们需要创建一个自定义验证。

我们的自定义验证采用输入数组并进行简单的计数。如果达到三,则返回TRUE。如果不是,则返回FALSE,验证失败。

回到我们的表单处理流程,我们需要做的就是将我们创建的自定义验证器的名称添加到我们的验证规则中。如果我们想设置一个自定义消息,我们也可以添加它。

还有更多...

为简单起见,该配方的附加验证程序在routes.php文件中。如果我们有多个自定义验证器,最好将它们放在自己的验证器文件中。为此,我们应该在我们的app目录中创建一个名为validator.php的文件,并添加我们想要的任何代码。然后,在app/start目录中打开global.php文件,并在文件末尾添加require app_path().'/validator.php'功能。这将自动加载我们所有的验证器。

搭建购物车

电子商务是网络上的一项巨大业务。大多数电子商务网站不可或缺的一部分是使用购物车系统。本食谱将介绍如何使用 Laravel 会话来存储待售商品和构建购物车。

做好准备

对于这个食谱,我们需要一个标准的 Laravel 安装,以及一个正确设置和配置的 MySQL 数据库。

怎么做...

要完成此配方,请遵循以下步骤:


  1. 在我们的数据库中,创建一个表,用这个 SQL 代码添加一些数据:

    ```php
    CREATE TABLE items (
    id int(10) unsigned NOT NULL AUTO_INCREMENT,
    name varchar(255) DEFAULT NULL,
    description text,
    price int(11) DEFAULT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB;

    INSERT INTO items VALUES ('1', 'Lamp', 'This is a Lamp.','14');
    INSERT INTO items VALUES ('2', 'Desk', 'This is a Desk.','75');
    INSERT INTO items VALUES ('3', 'Chair', 'This is a
    Chair.', '22');
    INSERT INTO items VALUES ('4', 'Sofa', 'This is a
    Sofa/Couch.', '144');
    INSERT INTO items VALUES ('5', 'TV', 'This is a
    Television.', '89');

    ```


  2. routes.php文件中,使用以下代码为我们的购物车创建路线:

    ```php
    Route::get('items', function()
    {
    $items = DB::table('items')->get();
    return View::make('items')->with('items', $items)>nest('cart', 'cart', array('cart_items' =>Session::get('cart')));
    });

    Route::get('item-detail/{id}', function($id)
    {
    $item = DB::table('items')->find($id);
    return View::make('item-detail')->with('item', $item)>nest('cart', 'cart', array('cart_items' =>Session::get('cart')));
    });

    Route::get('add-item/{id}', function($id)
    {
    $item = DB::table('items')->find($id);
    $cart = Session::get('cart');
    $cart[uniqid()] = array ('id' => $item->id, 'name' => $item >name, 'price' => $item->price);
    Session::put('cart', $cart);
    return Redirect::to('items');
    });

    Route::get('remove-item/{key}', function($key)
    {
    $cart = Session::get('cart');
    unset($cart[$key]);
    Session::put('cart', $cart);
    return Redirect::to('items');
    });

    Route::get('empty-cart', function()
    {
    Session::forget('cart');
    return Redirect::to('items');
    });
    ```


  3. views目录下,创建一个名为items.php的文件,代码如下:

    php














  4. views目录中,创建一个名为item-detail.php的文件,其给定代码为:

    php








    name ?>


    Price: price ?>


    Description: description ?>



    Add to Cart


    Item list








  5. views目录下,创建一个名为cart.php的文件,代码如下:

    php





      $cart_item_value): ?>


    • :
      (remove)



    Total:




  6. 现在,我们可以在浏览器中进入http://{your-server}/items查看数据库中的项目列表、它们详细页面的链接以及将它们添加到购物车中的选项。添加到购物车后,它们将显示在页面底部。



它是如何工作的...

为了开始这个食谱,我们需要建立一个数据库表来保存我们想要添加到购物车中的物品。我们还将添加一些测试项目,因此我们有一些数据可以使用。

在第一条路线中,我们获取表中所有现有的项目并显示它们。我们还嵌套在购物车视图中,该视图将显示我们已经添加的项目。在该嵌套视图中,我们还发送购物车会话,因此列表可以填充。

我们的下一条路线做了类似的事情,但它只接受一个项目,并显示全部信息。

下一条路线实际上添加了这些项目。首先,我们根据项目的标识从数据库中获取项目。然后我们将现有的 cart 会话保存到一个变量中,这样我们就可以操作它了。我们使用 php 的uniqid()函数作为我们的键,将该项目添加到数组中。然后我们将cart阵列放回Session并重定向它。

如果我们想要移除一个物品,我们首先要想办法获取该物品的 ID,并将其从cart数组中移除。另一种方法是删除所有会话并重新开始。

在我们看来,我们还会注意到,我们只允许cart列表显示购物车中是否真的有任何东西。

还有更多...

这个食谱可以很容易地扩展到功能更全。例如,如果我们多次点击同一个项目,我们可以存储每个项目的总数,而不是添加新记录。这样,我们可以在项目旁边添加一个要求数量的表单字段。

使用 Redis 保存会话

Redis 是一个流行的键/值数据存储,速度相当快。Laravel 包括对 Redis 的支持,并使其易于与 Redis 数据交互。

做好准备

对于这个方法,我们需要一个正确配置和运行的 Redis 服务器。更多信息可以在【http://redis.io/】的找到。

怎么做...

按照以下步骤至完成本食谱:


  1. 在我们的routes.php文件中,按照下面的代码创建路线:

    ```php
    Route::get('redis-login', function()
    {
    return View::make('redis-login');
    });

    Route::post('redis-login', function()
    {
    $redis = Redis::connection();
    $redis->hset('user', 'name', Input::get('name'));
    $redis->hset('user', 'email', Input::get('email'));
    return Redirect::to('redis-view');
    });

    Route::get('redis-view', function()
    {
    $redis = Redis::connection();
    $name = $redis->hget('user', 'name');
    $email = $redis->hget('user', 'email');
    echo 'Hello ' . $name . '. Your email is ' . $email;
    });
    ```


  2. views目录下,创建一个名为redis-login.php的文件,代码如下:

    php








    Redis Login


    'redis-login', 'method' =>'post')) ?>









  3. 现在,我们可以打开浏览器,进入http://{your-server}/redis-login并填写表格。提交后,我们将显示来自 Redis 的信息。



它是如何工作的...

我们的第一步是创建一个简单的表单,我们将使用它向 Redis 输入数据。在我们的redis-login路线中,我们使用一个视图,该视图将询问姓名和电子邮件地址,并且当提交时,将发布到redis-login路线。

发布后,我们使用Redis::connection()函数创建一个新的 Redis 实例,它将使用我们的app/config/database.php文件中的默认设置。为了在 Redis 中存储信息,我们使用了一个散列并使用hset()函数设置数据。我们的 Redis 实例可以使用 Redis 接受的任何命令,因此我们可以很容易地在功能之间进行选择,例如set()sadd()

一旦数据在 Redis 中,我们重定向到将显示数据的路由。为此,我们只需要用我们添加的键和字段调用hget()函数。

使用基本会话和 COOKIEs

有些时候,我们希望将数据从我们应用的一个页面传递到另一个页面,而不需要将信息存储在数据库中。为此,我们可以使用 Laravel 提供的各种SessionCOOKIE方法。

做好准备

对于这个食谱,我们需要一个标准的 Laravel 安装。

怎么做…

对于此配方,请遵循给定的步骤:


  1. views文件夹中,创建一个名为session-one.php的文件,其代码如下:

    php







    Laravel Sessions and COOKIEs



















  2. routes.php文件中,按照下面的代码创建我们的路线:

    ```php
    Route::get('session-one', function()
    {
    return View::make('session-one');
    });

    Route::post('session-one', function()
    {
    Session::put('email', Input::get('email'));
    Session::flash('name', Input::get('name'));
    $COOKIE = COOKIE::make('city', Input::get('city'), 30);
    return Redirect::to('session-two')->withCOOKIE($COOKIE);
    });

    Route::get('session-two', function()
    {
    $return = 'Your email, from a Session, is 'Session::get('email') . '.
    ';
    $return .= 'You name, from flash Session, is 'Session::get('name') . '.
    ';
    $return .= 'You city, from a COOKIE, is ' .COOKIE::get('city') . '.
    ';
    $return .= 'Next page';
    echo $return;
    });

    Route::get('session-three', function()
    {
    $return = '';

    if (Session::has('email')) {
    $return .= 'Your email, from a Session, is ' . Session::get('email') . '.
    ';
    } else {
    $return .= 'Email session is not set.
    ';
    }

    if (Session::has('name')) {
    $return .= 'Your name, from a flash Session, is ' . Session::get('name') . '.
    ';
    } else {
    $return .= 'Name session is not set.
    ';
    }

    if (COOKIE::has('city')) {
    $return .= 'Your city, from a COOKIE, is ' . COOKIE::get('city') . '.
    ';
    } else {
    $return .= 'City COOKIE is not set.
    ';
    }
    Session::forget('email');
    $return .= 'Reload';
    echo $return;
    });
    ```



它是如何工作的...

首先,我们创建一个简单的表单,用于向会议和 COOKIEs 提交信息。在发布值后,我们获取email字段并将其添加到常规会话中。name字段将被添加到 flash 会话中,而city将被添加到 COOKIE 中。此外,我们将设置 COOKIE 在 30 分钟后过期。一旦它们都设置好了,我们重定向到我们的第二个页面,并确保我们将 COOKIE 传递给返回值。

我们的第二页只是获取我们设置的值并显示它们,以验证它们是否设置正确。此时,一旦请求完成,我们的闪存会话(名称)将不再可用。

当我们点击进入第三页时,我们添加一些检查以确保会话和 COOKIEs 仍然存在,在这两个页面上使用has()方法。我们的emailcity仍然应该显示,但是name会话不应该显示。然后,我们使用 forget()方法删除email会话。当我们重新加载页面时,我们会注意到唯一还在显示的是city COOKIE。

还有更多...

闪存数据仅在我们提出下一个请求时可用,然后被删除。但是,如果我们想保留我们的闪存数据,我们可以使用Session::reflash()命令,它也会将数据发送给我们的下一个请求。如果我们有多个闪存数据,我们也可以使用Session::keep(array('your-session-key', 'your-other-session'))功能为下一个请求选择要保留的特定会话。

创建安全的应用编程接口服务器

在这个食谱中,我们将创建一个简单的应用编程接口来显示数据库中的一些信息。为了控制谁有权访问数据,我们允许用户创建密钥,并在他们的 API 请求中使用该密钥。

做好准备

对于这个食谱,我们需要一个标准安装的 Laravel 和一个配置好的 MySQL 数据库。

怎么做...

为了完成这个食谱,我们将遵循以下步骤:


  1. 在我们的数据库中,创建一个表来保存 API 键,如下面的代码所示:

    php
    CREATE TABLE api (
    id int(10) unsigned NOT NULL AUTO_INCREMENT,
    name varchar(255) DEFAULT NULL,
    api_key varchar(255) DEFAULT NULL,
    status tinyint(1) DEFAULT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


  2. 在数据库中,为一些要访问的示例数据创建一个表,如下面的代码所示:

    ```php
    CREATE TABLE shows (id int(10) unsigned NOT NULL AUTO_INCREMENT,name varchar(200) NOT NULL,year int(11) NOT NULL,created_at datetime NOT NULL,updated_at datetime NOT NULL,PRIMARY KEY (id)) ENGINE=InnoDB CHARSET=utf8;

    INSERT INTO shows VALUES ('1', 'Happy Days', '1979','2013-01-01 00:00:00', '2013-01-01 00:00:00');
    INSERT INTO shows VALUES ('2', 'Seinfeld', '1999', '2013-01-01 00:00:00', '2013-01-01 00:00:00');
    INSERT INTO shows VALUES ('3', 'Arrested Development', '2006', '2013-01-01 00:00:00', '2013-01-01 00:00:00');
    INSERT INTO shows VALUES ('4', 'Friends', '1997','2013-01-01 00:00:00', '2013-01-01 00:00:00');
    ```


  3. models目录下,创建一个名为Api.php

    ```php

    class Api extends Eloquent {

    public $table = 'api';
    public $timestamps = FALSE;
    }
    ```

    的文件
    4. 在models目录中,创建一个名为Show.php

    php
    class Show extends Eloquent {
    }

    的文件
    5. 在views目录中,创建一个名为api-key.php

    php







    Create an API key










    的文件
    6. 在routes.php文件中,创建路线以允许api-key注册

    ```php
    Route::get('api-key', function() {
    return View::make('api-key');
    });

    Route::post('api-key', function() {
    $api = new Api();
    $api->name = Input::get('name');
    $api->api_key = Str::random(16);
    $api->status = 1;
    $api->save();
    echo 'Your key is: ' . $api->api_key;
    });
    ```


  4. routes.php中,通过以下代码创建路线以进入api:

    php
    Route::get('api/{api_key}/shows', function($api_key)
    {
    $client = Api::where('api_key', '=', $api_key)->where('status', '=', 1)->first();
    if ($client) {
    return Show::all();
    } else {
    return Response::json('Not Authorized', 401);
    }
    });
    Route::get('api/{api_key}/show/{show_id}', function($api_key, $show_id)
    {
    $client = Api::where('api_key', '=', $api_key)->where('status', '=', 1)->first();
    if ($client) {
    if ($show = Show::find($show_id)) {
    return $show;
    } else {
    return Response::json('No Results', 204);
    }
    } else {
    return Response::json('Not Authorized', 401);
    }
    });


  5. 要测试出来,在浏览器中,转到http://{your-server}/api-key(其中{your-server}是开发服务器的名称)并填写表格。在下一页,复制生成的密钥。然后,转到http://{your-server}/api/{your-copied-key}/shows,一个节目列表将以json格式出现。



它是如何工作的...

我们从设置我们的桌子和模型开始。我们的 API 表将用于检查密钥,show表将是我们将使用密钥访问的测试数据。

我们的下一个任务是创建一种为我们的应用生成密钥的方法。在这个例子中,我们只取一个名称值。提交后,我们创建一个随机的 16 个字符的字符串作为用户的密钥。然后,我们将信息保存到表中,并向用户显示密钥。

为了使用这个键,我们创建了两条路线来显示信息。第一条路由在 URL 中使用{api_key}通配符,并将该值传递给我们的函数。然后,我们在数据库中查询该键,并确保状态仍然是活动的。这样,如果我们决定撤销用户的密钥,我们可以将状态设置为 false,他们将无法使用该应用编程接口。如果它们不存在或者状态为假,我们用 HTTP 代码 401 来响应,以表明它们没有被授权。否则,我们返回允许我们以json格式显示记录的雄辩对象。

我们的第二条路线将显示一场演出的记录。对于该网址,我们使用{api_key}通配符作为关键字,使用{show_id}通配符作为节目的标识。我们将这些传递给函数,然后像以前一样检查密钥。如果密钥有效,我们确保具有该标识的节目存在,并再次使用“雄辩”对象以json格式仅显示具有给定标识的节目。

还有更多...

我们也可以选择使用 Laravel 过滤器,如果我们更愿意发布 api 密钥。为此,我们将在filters.php文件中创建新的过滤器

Route::filter('api', function()
{
if ($api_key = Input::get('api_key')) {
$client = Api::where('api_key', '=', $api_key)->where('status', '=', 1)->first();
if (!$client) {
return Response::json('Not Authorized', 401);
}
} else {
return Response::json('Not Authorized', 401);
}
});

然后,对于我们的shows路线,我们响应一个发布请求并添加before过滤器,如下代码所示:

Route::post('api/shows', array('before' => 'api', function()
{
return Show::all();
}));

推荐阅读
  • 深入浅出JWT
    JWT(JSONWEBTOKEN)的组成https:jwt.ioheader(头部)承载两部分信息:声明 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 腾讯T3大牛亲自教你!2021大厂Android面试经验,经典好文
    本篇将由环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来等七个方面,对当前的ReactNative和Flutter进行全面的分析对比, ... [详细]
  • 这座城市多了十只伤心的鸽
    这个作业属于哪个课程2021春软件工程实践|W班(福州大学)这个作业要求在哪里团队第四次作业这个作业的目标设计项目原型、制作项目需求规格说明书团队名称这座城市多了十只伤心的鸽其他参 ... [详细]
  • 前端跨域访问后端数据的方法
    参考链接:https:mp.weixin.qq.coms4G_27oRLSMMYBFvtYZgqcg一、什么是跨域当两个域名的协议、子域名、主域名、端口号中有任意一个不 ... [详细]
author-avatar
徐徐回忆_545
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有