We have switched to facebook/graph-sdk 5.4 !
$ composer require crada/phalcon-user-plugin:^3.0
This is a plugin based on Vokuro ACL idea.
The recommended installation is via Composer. Just add the following line to your composer.json
:
{
"require": {
"crada/phalcon-user-plugin": "~2.0"
}
}
$ php composer.phar update
Add the following lines where to your events manager:
$security = new \Phalcon\UserPlugin\Plugin\Security($di);
$eventsManager->attach('dispatch', $security);
Full example code:
use Phalcon\UserPlugin\Plugin\Security as SecurityPlugin;
use Phalcon\Mvc\Dispatcher;
$di->setShared(
'dispatcher',
function() use ($di) {
$eventsManager = $di->getShared('eventsManager');
$security = new SecurityPlugin($di);
$eventsManager->attach('dispatch', $security);
$dispatcher = new Dispatcher();
$dispatcher->setEventsManager($eventsManager);
return $dispatcher;
}
);
Register Auth, Mail and Acl services
use Phalcon\UserPlugin\Auth\Auth;
use Phalcon\UserPlugin\Acl\Acl;
use Phalcon\UserPlugin\Mail\Mail;
$di->setShared(
'auth',
function() {
return new Auth();
}
);
$di->setShared(
'acl',
function() {
return new Acl();
}
);
$di->setShared(
'mail',
function() {
return new Mail();
}
);
You must add configuration keys to your config.php file. If you are using a multimodule application, i recommend you to set up the configuration separately for each module.
In the example bellow, you will treat your website as public, EXCEPT the actions ACCOUNT and PROFILE from the USER controller:
'pup' => [
'redirect' => [
'success' => 'user/profile',
'failure' => 'user/login'
],
'resources' => [
'type' => 'public',
'resources' => [
'*' => [
// All except
'user' => ['account', 'profile']
]
]
]
];
In the example bellow, the ONLY PUBLIC resources are the actions LOGIN and REGISTER from the USER controller:
'pup' => [
'redirect' => [
'success' => 'user/profile',
'failure' => 'user/login'
],
'resources' => [
'type' => 'public',
'resources' => [
'user' => [
'user' => ['login', 'register']
]
]
]
];
In the example bellow, you will treat your website as private, EXCEPT the actions LOGIN and REGISTER from the USER controller:
'pup' => [
'redirect' => [
'success' => 'user/profile',
'failure' => 'user/login'
],
'resources' => [
'type' => 'private',
'resources' => [
'*' => [
// All except
'user' => ['login', 'register']
]
]
]
];
In the example bellow, the ONLY PRIVATE resources are the actions ACCOUNT and PROFILE from the USER controller:
'pup' => [
'redirect' => [
'success' => 'user/profile',
'failure' => 'user/login'
],
'resources' => [
'type' => 'private',
'resources' => [
'user' => [
'user' => ['account', 'profile']
]
]
]
];
Configuration example with connectors:
// phalcon-user-plugin
'pup' => [
'redirect' => [
'success' => 'user/profile',
'failure' => 'user/login'
],
'resources' => [
'type' => 'public',
'resources' => [
'*' => [
// All except
'user' => ['account', 'profile']
]
]
],
'connectors' => [
'facebook' => [
'appId' => 'YOUR_FACEBOOK_APP_ID',
'secret' => 'YOUR_FACEBOOK_APP_SECRET'
],
'linkedIn' => [
'api_key' => 'YOUR_LINKED_IN_APP_ID',
'api_secret' => 'YOUR_LINKED_IN_APP_SECRET',
'callback_url' => 'CALLBACK_URL'
],
'twitter' => [
'consumer_key' => 'TWITTER_CONSUMER_KEY',
'consumer_secret' => 'TWITTER_CONSUMER_SECRET',
// Leave empty if you don't want to set it
'user_agent' => 'YOUR_APPLICATION_NAME'
],
'google' => [
'application_name' => 'YOUR_APPLICATION_NAME',
'client_id' => 'YOUR_CLIENT_ID',
'client_secret' => 'YOUR_CLIENT_SECRET',
'developer_key' => 'YOUR_DEVELOPER_KEY',
'redirect_uri' => 'YOUR_REDIRECT_URI'
]
]
];
class UserController extends Controller
{
/**
* Login user
* @return \Phalcon\Http\ResponseInterface
*/
public function loginAction()
{
if (true === $this->auth->isUserSignedIn()) {
$this->response->redirect(['action' => 'profile']);
}
$form = new LoginForm();
try {
$this->auth->login($form);
} catch (AuthException $e) {
$this->flash->error($e->getMessage());
}
$this->view->form = $form;
}
/**
* Login with Facebook account
*/
public function loginWithFacebookAction()
{
try {
$this->view->disable();
return $this->auth->loginWithFacebook();
} catch(AuthException $e) {
$this->flash->error('There was an error connectiong to Facebook.');
}
}
/**
* Login with LinkedIn account
*/
public function loginWithLinkedInAction()
{
try {
$this->view->disable();
$this->auth->loginWithLinkedIn();
} catch(AuthException $e) {
$this->flash->error('There was an error connectiong to LinkedIn.');
}
}
/**
* Login with Twitter account
*/
public function loginWithTwitterAction()
{
try {
$this->view->disable();
$this->auth->loginWithTwitter();
} catch(AuthException $e) {
$this->flash->error('There was an error connectiong to Twitter.');
}
}
/**
* Login with Google account
*/
public function loginWithGoogleAction()
{
try {
$this->view->disable();
$this->auth->loginWithGoogle();
} catch(AuthException $e) {
$this->flash->error('There was an error connectiong to Google.');
}
}
/**
* Logout user and clear the data from session
*
* @return \Phalcon\Http\ResponseInterface
*/
public function signoutAction()
{
$this->auth->remove();
return $this->response->redirect('/', true);
}
}