autentizace v administraci
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- mardon
- Člen | 59
Chtěla bych si pro svůj web zprovoznit administraci. Vycházela jsem z příkladu CD-collection, přihlašovací formulář mi funguje a přesměruje na /presenters/AdminModule/HomepagePresenter
<?php
class Admin_HomepagePresenter extends Admin_BasePresenter
?>
/presenters/AdminModule/BasePresenter
<?php
abstract class Admin_BasePresenter extends BasePresenter{
protected function startup()
{
// user authentication
$user = Environment::getUser();
if (!$user->isAuthenticated()) {
if ($user->getSignOutReason() === User::INACTIVITY) {
$this->flashMessage('You have been logged out due to inactivity. Please login again.');
}
$backlink = $this->getApplication()->storeRequest();
$this->redirect('Admin:default', array('backlink' => $backlink));
}
parent::startup();
}
}
?>
z /presenters/AdminModule/HomepagePresenter bych chtěla přejít na /presenters/AdminModule/ServicePresenter, kde chci použít fomulář pro vložení a editaci záznamu v db
<?php
class Admin_ServicePresenter extends Admin_BasePresenter {
public function renderDefault() {
$service = new ServiceModel();
$this->template->service = $service->getService(array('date' => dibi::DESC));
}
public function renderEdit($id = 0) {
$form = $this['serviceForm'];
if (!$form->isSubmitted()) {
$service = new ServiceModel();
$data = $service->getServiceid($id);
if (!$data) {
throw new BadRequestException('Record not found');
}
$form->setDefaults($data);
}
}
protected function createComponentServiceForm() {
$form = new AppForm;
$form->addText('name', 'Název služby:')
->addRule(Form::FILLED, 'Název služby.');
$form->addText('id_cat', 'Kategorie:')
->addRule(Form::FILLED, 'Please enter a title.');
$form->addSubmit('save', 'Save')->getControlPrototype()->class('default');
$form->addSubmit('cancel', 'Cancel')->setValidationScope(NULL);
$form->onSubmit[] = callback($this, 'serviceFormSubmitted');
$form->addProtection('Please submit this form again (security token has expired).');
return $form;
}
public function serviceFormSubmitted(AppForm $form) {
if ($form['save']->isSubmittedBy()) {
$id = (int) $this->getParam('id');
$service = new ServiceModel();
if ($id > 0) {
$service->update($id, $form->getValues());
$this->flashMessage('Služba byla upravena.');
} else {
$service->insert($form->getValues());
$this->flashMessage('Služba byla přidána.');
}
}
}
}
?>
Problémem je , že při zavolání editace v ServicePresenteru mi vyskočí znovu přihlašovací okno tedy systém mě odhlásil, nebo nepoznal , že jsem byl přihlášená.
- mardon
- Člen | 59
<?php
class LoginPresenter extends BasePresenter {
/** @persistent */
public $backlink = '';
/********************* component factories *********************/
/**
* Login form component factory.
* @return mixed
*/
protected function createComponentLoginForm() {
$form = new AppForm;
$form->addText('username', 'Jméno:')
->addRule(Form::FILLED, 'Zadejte jméno.');
$form->addPassword('password', 'Heslo:')
->addRule(Form::FILLED, 'Zadejte heslo.');
$form->addSubmit('login', 'Přihlásit');
$form->addProtection('Please submit this form again (security token has expired).');
$form->onSubmit[] = callback($this, 'loginFormSubmitted');
return $form;
}
public function loginFormSubmitted($form) {
try {
$user = Environment::getUser();
$user->authenticate($form['username']->getValue(), $form['password']->getValue());
$this->getApplication()->restoreRequest($this->backlink);
$this->redirect('Admin:Homepage:');
} catch (AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
}
?>
- mardon
- Člen | 59
<?php
/**
* My Application
*
* @copyright Copyright (c) 2010 John Doe
* @package MyApplication
*/
/**
* Users authenticator.
*
* @author John Doe
* @package MyApplication
*/
class UsersModel extends BaseModel implements IAuthenticator
{
/**
* Performs an authentication
* @param array
* @return IIdentity
* @throws AuthenticationException
*/
public function authenticate(array $credentials)
{
$username = $credentials[self::USERNAME];
$password = md5($credentials[self::PASSWORD]);
$row = $this->db->fetch('SELECT * FROM users WHERE login=%s', $username);
if (!$row) {
throw new AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
}
if ($row->password !== $password) {
throw new AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
}
unset($row->password);
return new Identity($row->id,$row);
}
}
?>