php - sistema - remember_token laravel
Evitar sesiones para rutas en Laravel(manejo personalizado de sesiones a pedido) (6)
Estoy creando API para mi aplicación de Android utilizando laravel y el controlador de sesión predeterminado configurado en REDIS.
Encontré un buen artículo aquí http://dor.ky/laravel-prevent-sessions-for-routes-via-a-filter/, que sirve para el propósito.
Sin embargo, cada vez que toco la url, también golpea la redis y genera la clave que está vacía. Ahora quiero evitar crear claves de sesión vacías en redis. Lo ideal sería no golpear el redis ¿Cómo puedo hacer eso?
¿Podemos personalizar sessios de forma que las sesiones se generen solo para rutas específicas (o deshabilitar para rutas específicas)?
Puedo explicar más con el caso de uso específico, por favor hágamelo saber.
La forma más sencilla de lograr esto es crear su propio middleware AppStartSession que subclasifica Illuminate / Session / Middleware / StartSession y reemplaza la clase que se utiliza en kernel.php. El único método que debe sobrescribir en su subclase es sessionConfigured () para el que puede devolver false para deshabilitar la sesión o parent :: sessionConfigured () para permitirlo.
<?php
namespace App/Http/Middleware;
use Closure;
use Illuminate/Session/Middleware/StartSession;
class AppStartSession extends StartSession
{
protected function sessionConfigured(){
if(!/Request::has(''api_key'')){
return false;
}else{
return parent::sessionConfigured();
}
}
}
kernel.php (ver *** comentario para donde se hace el cambio)
<?php
namespace App/Http;
use Illuminate/Foundation/Http/Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application''s global HTTP middleware stack.
*
* @var array
*/
protected $middleware = [
/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode::class,
/App/Http/Middleware/EncryptCookies::class,
/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse::class,
// *** Replace start session class
// /Illuminate/Session/Middleware/StartSession::class,
/App/Http/Middleware/AppStartSession::class,
// *** Also comment these ones that depend on there always being a session.
///Illuminate/View/Middleware/ShareErrorsFromSession::class,
///App/Http/Middleware/VerifyCsrfToken::class,
];
/**
* The application''s route middleware.
*
* @var array
*/
protected $routeMiddleware = [
''auth'' => /App/Http/Middleware/Authenticate::class,
''auth.basic'' => /Illuminate/Auth/Middleware/AuthenticateWithBasicAuth::class,
''guest'' => /App/Http/Middleware/RedirectIfAuthenticated::class,
];
}
¡No luches contra el marco, abrázalo!
Parece que hay una manera de lograr esto usando una devolución de llamada de rechazo de sesión.
Fuentes relevantes ...
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Foundation/Application.php#L655
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Foundation/Application.php#L660
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Session/Middleware.php#L60
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Session/Middleware.php#L97
No puedo encontrar muchas referencias a esto en la web, pero leyendo más a través de la fuente parece que si la sesión rechaza la devolución de llamada devuelve un valor verdadero, la sesión se verá obligada a usar un controlador de matriz para la solicitud en lugar de lo que esté configurado . Su devolución de llamada también recibe la solicitud actual inyectada para que pueda hacer un poco de lógica en función de los parámetros de solicitud.
Solo probé esto en una instalación local de Laravel 4.2 pero parece funcionar. Solo necesita vincular una función a session.reject.
Primero, crea un SessionRejectServiceProvider (o algo así)
<?php
use /Illuminate/Support/ServiceProvider;
class SessionRejectServiceProvider extends ServiceProvider {
public function register()
{
$me = $this;
$this->app->bind(''session.reject'', function($app)use($me){
return function($request)use($me){
return call_user_func_array(array($me, ''reject''), array($request));
};
});
}
// Put the guts of whatever you want to do in here, in this case I''ve
// disabled sessions for every request that is an Ajax request, you
// could do something else like check the path against a list and
// selectively return true if there''s a match.
protected function reject($request)
{
return $request->ajax();
}
}
Luego agréguelo a sus proveedores en su aplicación / config / app.php
<?php
return array(
// ... other stuff
''providers'' => array(
// ... existing stuff...
''SessionRejectServiceProvider'',
),
);
Editar / Más información
El resultado neto es que se llama al método Reject () en cada solicitud a su aplicación, antes de que se inicie la sesión. Si su método de rechazo () devuelve verdadero, las sesiones se establecerán en el controlador de matriz y básicamente no harán nada. Puede encontrar mucha información útil sobre el parámetro $ request para determinar esto, aquí está la referencia de API para el objeto de solicitud en 4.2.
En Laravel 5, simplemente no use los middleware StartSession
, ShareErrorsFromSession
y VerifyCsrfToken
.
En mi aplicación, he trasladado estos tres middlewares del grupo web
a un nuevo grupo con stateful
, y luego he incluido este grupo con stateful
en las rutas que deben conocer sobre la sesión (además de la web
en todos los casos, en mi aplicación en menos). Las otras rutas pertenecen a los grupos web
o api
.
Ahora, al realizar solicitudes a las rutas que no utilizan la sesión de grupo de middleware con stateful
, las cookies no se envían de regreso.
Desde Laravel 5.2, cuando se introdujeron los grupos de middleware, puede desactivar la sesión para ciertas rutas definiéndolas fuera del grupo de middleware "web" (que incluye el middleware StartSession responsable del manejo de la sesión). Al igual que en las últimas versiones 5.2.x, todo el archivo routes.php predeterminado se envuelve con el grupo de middleware "web", debe realizar algunas modificaciones en el archivo app/Providers/RouteServiceProvider.php
, tal como se describe aquí .
He estado tratando de lograr una función similar.
Nuestra API es apátrida a excepción de 1 ruta: la versión 1 de la cesta.
Terminé configurando ''driver''
en la aplicación / config / session.php así ...
''driver'' => ''v1/cart'' === Request::getDecodedPath() ? ''native'' : ''array'',
Nada mágico Inicialmente pensamos en usar un filtro anterior, pero eso no estaba sucediendo lo suficientemente temprano.
Parece una forma simple de hacer las cosas, pero me puede estar perdiendo algo.
Poner el interruptor en la configuración parece un lugar fácil para que otros desarrolladores vean qué es el controlador, mientras que ponerlo en un proveedor de servicios está tan escondido, sin saber qué proveedores de servicios están instalados y con qué interactúan, sería mucho más difícil de depurar.
De todas formas. Espero que esto sirva para algo.
Como se señala a continuación ... NO CACHE SU CONFIGURACIÓN SI ES DINÁMICO.
Lo que hace que sea de uso limitado. Tan pronto como ya no necesitemos soporte para v1 / cart, abandonaremos esta ruta y luego volveremos a tener una configuración estática.
Es realmente fácil usar el middleware en Laravel 5, necesitaba una solicitud con una clave API para no tener una sesión y simplemente lo hice:
<?php
namespace App/Http/Middleware;
use Closure;
use Illuminate/Session/Middleware/StartSession as BaseStartSession;
class StartSession extends BaseStartSession
{
/**
* Handle an incoming request.
*
* @param /Illuminate/Http/Request $request
* @param /Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(/Request::has(''api_key''))
{
/Config::set(''session.driver'', ''array'');
}
return parent::handle($request, $next);
}
}
También necesitará extender el SessionServiceProvider de la siguiente manera:
<?php namespace App/Providers;
use Illuminate/Session/SessionServiceProvider as BaseSessionServiceProvider;
class SessionServiceProvider extends BaseSessionServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->registerSessionManager();
$this->registerSessionDriver();
$this->app->singleton(''App/Http/Middleware/StartSession'');
}
}
y coloque en su config/app.php
bajo providers
:
''App/Providers/SessionServiceProvider'',
También debe cambiarlo en su archivo kernel: App/Http/Kernel.php
, en la sección $middlewareGroups
cambie la entrada predeterminada, /Illuminate/Session/Middleware/StartSession::class,
a su nueva clase /App/Http/Middleware/StartSession::class,