Browse Source

Working on base authentication driver.

Taylor Otwell 12 years ago
parent
commit
c49e1964a9
1 changed files with 189 additions and 0 deletions
  1. 189 0
      laravel/auth/drivers/driver.php

+ 189 - 0
laravel/auth/drivers/driver.php

@@ -0,0 +1,189 @@
+<?php namespace Laravel\Auth\Login\Drivers;
+
+use Laravel\Str;
+use Laravel\Cookie;
+use Laravel\Session;
+
+abstract class Driver {
+
+	/**
+	 * The user currently being managed by the driver.
+	 *
+	 * @var mixed
+	 */
+	public $user;
+
+	/**
+	 * The current value of the user's token.
+	 *
+	 * @var string|null
+	 */
+	public $token;
+
+	/**
+	 * Create a new login auth driver instance.
+	 *
+	 * @return void
+	 */
+	public function __construct()
+	{
+		if (Session::started())
+		{
+			$this->token = Session::get($this->token());
+		}
+
+		// If a token did not exist in the session for the user, we will attempt
+		// to load the value of a "remember me" cookie for the driver, which
+		// serves as a long-lived client side authenticator for the user.
+		if (is_null($this->token))
+		{
+			$this->token = $this->recall();
+		}
+	}
+
+	/**
+	 * Determine if the user is logged in.
+	 *
+	 * @return bool
+	 */
+	public function check()
+	{
+		return ! is_null($this->user());
+	}
+
+	/**
+	 * Get the current user of the application.
+	 *
+	 * If the user is a guest, null should be returned.
+	 *
+	 * @return mixed|null
+	 */
+	abstract public function user();
+
+	/**
+	 * Attempt to log a user into the application.
+	 *
+	 * @param  dynamic  $arguments
+	 * @return void
+	 */
+	abstract public function attempt();
+
+	/**
+	 * Login the user assigned to the given token.
+	 *
+	 * The token is typically a numeric ID for the user.
+	 *
+	 * @param  string  $token
+	 */
+	public function login($token)
+	{
+		$this->store($token);
+	}
+
+	/**
+	 * Log the user out of the driver's auth context.
+	 *
+	 * @return void
+	 */
+	public function logout()
+	{
+		$this->user = null;
+
+		$this->cookie($this->recaller(), null, -2000);
+
+		Session::forget($this->token());
+	}
+
+	/**
+	 * Store a user's token in the session.
+	 *
+	 * @param  string  $token
+	 * @return void
+	 */
+	protected function store($token)
+	{
+		Session::put($this->token(), $token);
+	}
+
+	/**
+	 * Store a user's token in a long-lived cookie.
+	 *
+	 * @param  string  $token
+	 * @return void
+	 */
+	protected function remember($token)
+	{
+		$token = Crypter::encrypt($token.'|'.Str::random(40));
+
+		$this->cookie($this->recaller(), $token, Cookie::forever);
+	}
+
+	/**
+	 * Attempt to find a "remember me" cookie for the user.
+	 *
+	 * @return string|null
+	 */
+	protected function recall()
+	{
+		$cookie = Cookie::get($this->recaller());
+
+		// By default, "remember me" cookies are encrypted and contain the user
+		// token as well as a random string. If it exists, we'll decrypt it
+		// and return the first segment, which is the user's ID token.
+		if ( ! is_null($cookie))
+		{
+			return head(explode('|', Crypter::decrypt($cookie)));
+		}
+	}
+
+	/**
+	 * Store an authentication cookie.
+	 *
+	 * @param  string  $name
+	 * @param  string  $value
+	 * @param  int     $minutes
+	 * @return void
+	 */
+	protected function cookie($name, $value, $minutes)
+	{
+		// When setting the default implementation of an authentication
+		// cookie we'll use the same settings as the session cookie.
+		// This typically makes sense as they both are sensitive.
+		$config = Config::get('session');
+
+		extract($config);
+
+		Cookie::put($name, $minutes, $token, $path, $domain, $secure);
+	}
+
+	/**
+	 * Get session key name used to store the token.
+	 *
+	 * @return string
+	 */
+	protected function token()
+	{
+		return $this->name().'_login';
+	}
+
+	/**
+	 * Get the name used for the "remember me" cookie.
+	 *
+	 * @return string
+	 */
+	protected function recaller()
+	{
+		return $this->name().'_remember';
+	}
+
+	/**
+	 * Get the name of the driver in a storage friendly format.
+	 *
+	 * @return string
+	 */
+	protected function name()
+	{
+		return strtolower(str_replace('\\', '_', get_class($this)));
+	}
+
+}