Програмиране на SfGuard в проекти на Symfony

symfony 1.4 - изработка на сайтове
В тази статия, която се явява нещо като урок за тези, които сега се запознават със Symfony, ще опиша един от начините за работа със SfDoctrineGuard във визуалната част на приложението на Symfony 1.4. Надявам се, че урока ще помогне за по-добра изработка на уеб сайтове от ваша страна. За да се справите с тази задача е необходимо да имате основни познания за Symfony Framework. Следващите редове са за тези от вас, които вече са преминали през част от документацията и са стигнали до проблема с използването на SfDoctrineGuard. Не напразно използвах думата проблем, защото документацията за тази добавка е недостатъчна за повечето програмисти. Именно това беше мотивът да напиша тази статия. В началото ще разкажа малко за самият “plugin”. SfDoctrineGuard е една чудесна добавка, която ви позволява да защитите вашето приложение с добра логин система, с която можете да контролирате достъпа на потребителите до съдържанието на уеб сайта ви на различни нива. Но SfDoctrineGuard се явява само основа, върху която се гради самата система. Тази добавка няма програмирана система за регистрация на потребителите за това към нея трябва да се добави друга добавка, за да работи всичко по-прилично и както се полага.
Ето една проста схема за това, с което ще ви запозная в тази статия:

– Инсталиране на SfDoctrineGuard в визуалната част на вашия уеб сайт

– Инсталиране и конфигуриране на SfDoctrineForkedApply

– Администриране на плъгините според нуждите ви

Да започнем с инсталацията на SfDoctrineGuard. Добавката можете да намерите ТУК или да потърсите в Symfony уеб сайт последната версия.
– След изтеглянето разархивирайте файла в папката на вашия уеб сайт /plugins/.
– Намерете config/ProjectConfiguration.class.php
symfony 1.4 - програмиране
в проекта си и добавете следните редове в него.
С това започва вече нашето програмиране:

class ProjectConfiguration extends sfProjectConfiguration {
   public function setup() {
      $this->enablePlugins(array('sfDoctrinePlugin','sfDoctrineGuardPlugin'));
   }
}

– Напишете следните команда в CMD.
НАПОМНЯНЕ:За да e валидна тези команда трябва предварително да сте влезли в директорията на проекта. Примерено: C:xampphtdocsyour_project вашият проект.

php symfony doctrine:build --all --and-load

sfGuard - програмиране

Тези редове, които написахте изграждат наново вашия модел на базата данни, като в него вече са включени и таблиците на добавката. Може да видите това, като проверите новите допълнения в структурата. По този начин SfGuard създава всички необходими класове, за да работи във вашето приложение.
-Отворете файла settings.yml , който се намира тук: apps/frontend/config/settings.yml
sfGuard - изработка на сайтове
Намерете пасажа:

all:
  .settings:
  enabled_modules:

и го променете по следния начин:

all:
  .settings:
  enabled_modules: [default, sfGuardAuth]

Намерете реда .actions: в същият файл и добавете следното

.actions:
  login_module: login
  login_action: index
  secure_module: login
  secure_action: index

След това изчистете кеш-а, като в CMD въведете:

symfony cc

уеб програмиране
– Намерете класа myUser.class.php ,който се намира в apps/frontend/lib/myUser.class.php
изработка на сайтове
и го програмирайте по следния начин:

class myUser extends sfGuardSecurityUser {
}

Финалната стъпка е да влезете във файла security.yml, който се намира в apps/frontend/config/security.yml
Symfony и sfGuard програмиране
и да го заместите със следното:

default:
  is_secure: true

По този начин цялата визуална част на вашия уебсайт става недостъпно за нерегистрирани потребители. Сега имате защитено приложение, но то не е достъпно дори и за вас. За да промените това трябва да създадете потребител с права “SuperAdministrator” по следният начин. В CMD напишете:

php symfony guard:create-user [email protected] Username YourPassword

Symfony и sfGuard в уеб сайтове
След създаването на потребителя му дайте права на супер-администратор със следващия ред:

php symfony guard:promote Username

symfony gaurd promote username
За сега толкова за sfGuard. Време е да инсталираме SfDoctrineForkedApply plugin. С негова помощ ще можете да създавате нови потребители. Добавката ви дава широки възможности за конфигуриране според нуждите ви. В регистрационната форма може да добавите captcha, регистрирането на нов акаунт да става с Имейл потвърждение. Потребителите могат да променят паролата си и да редактират профила си. Да започнем с инсталирането.
– Изтеглете Плъгина от тук: или намерете последната версия тук.
– Разархивирайте в папката на вашия проект /plugins/.
– След това както и с SfGuard добавяте в config/ProjectConfiguration.class.php
sfGuard plugin - уеб програмиране
– Трябва да разрешите използването на добавката и класът трябва да има следния вид:

class ProjectConfiguration extends sfProjectConfiguration {
   public function setup() {
      $this->enablePlugins(array('sfDoctrinePlugin','sfDoctrineGuardPlugin','sfForkedDoctrineApplyPlugin',));
   }
}

– Отваряте CMD и пишете следните команди:

Php symfony doctrine:generate-migrations-diff

symfony generate migrations diff

symfony doctrine:migrate

symfony migrate

php symfony doctrine:build --all --and-load

symfony build all
С последния ред отново ресетвате съдържанието на база данни.
– Създайте си отново потребител и го направете супер-администратор по начина описан по-горе.
Сега отворете apps/frontend/config/settings.yml
Symfony config
и към

all:
.settings:
  enabled_modules: [default, sfGuardAuth]

добавете sfApply

enabled_modules: [default, sfGuardAuth, sfApply]

Добавете и следващия ред:

i18n: true

Отидете в /config/security.yml и променете

default:
    is_secure: true

на

default:
  is_secure: false

С тази команда премахвате глобалната защита, но по-нататък ще видите как да защитите отделно само модулите, които вие желаете. Понеже се предполага, че работим на локален сървър, емайл потвърждението за създаване на акаунт трябва да се деактивира. За тази цел:
– отидете в /plugins/sfForkedDoctrineApplyPlugin/config/ и отворете
app.yml
Symfony plugin – Sf Guard
Намерете следните редове:

confirmation:
  reset: true
  apply: true
  email: true
  reset_logged: false

Променете ги така:

confirmation:
  reset: false
  apply: false
  email: false
  reset_logged: false

По този начин вие вече може да създавате нови потребители.
– Отидете в папката /templates/ и отворете layout.php. преди

 echo $sf_content 

добавете

include_component('sfApply', 'login');

С тази команда извиквате вашият логин статус. Ако вече сте регистрирани, ще излязат данните ви и линкове за редактиране и промяна на парола. Ако не сте регистрирани, ще се зареди форма за регистрация.
ЗАБЕЛЕЖКА: Този ред include_component('sfApply', 'login'); може да бъде добавен на всякъде в проекта, но когато е в “Layout.php”, логин статуса е достъпен от всеки модул.
Предполага се, че когато програмирате уеб сайт, не всички страници ще са видими само за регистрирани потребители. За това ще създадем модул, който не изисква регистрация, и който ще се вижда от всички потребители.
В CMD напишете:

php symfony generate:module frontend login

symfony generate module frontend login
по този начин създавате празен модул, в който ще поместим логин частта. Отидете в action.class.php на този модул и намерете функцията

public function executeIndex(sfWebRequest $request) { }

Премахнете съдържанието и и я оставете в този и вид. След това отидете в config/settings.yml , и задайте параметрите на новия модул.

.actions:
  login_module: login
  login_action: index

По този начин, ако в routing.yml сте задали заглавна страница от защитен модул, ще бъдете пренасочени не към нея, а към страницата index в модула login. След успешното въвеждане на име и парола, ще се зареди страницата, която сте посочили за заглавна. За да видите нагледно как действа това, и за да покажа защитата на отделни страници от даден модул ще е необходимо да програмираме такъв.
В cmd напишете:

symfony generate:module frontend test

symfony generate module test
Първото нещо, което ще направим, е да влезем в action.php на този модул и да махнем съдържанието от функцията executeIndex, както направихме по-горе с модула login. След това създаваме нова папка с име config в директорията на модула. В тази папка създаваме файл с име security.yml. Чрез него ще програмираме настройки за сигурност на нашия уеб сайт специфични само за този модул. За начало задаваме

default:
  is_secure: true

За да видим как действа самото пренасочване отиваме в config/routing.yml на проекта и задаваме като заглавна страница index от модула test, която е видима само за регистрирани потребители.

homepage:
  url: /
  param: { module: test, action: index }

Може да сложите някакво съдържание в login/index и test/index, за да разберете как работи всичко. По-подробно обяснение на правата за достъп ще напиша след създаването на бакенд приложението. Сега ще се насоча към един основен въпрос, който изниква след като инсталираме двете добавки. Той е :

“Как да променим формата за регистрация според нашите нужди?”

След инсталацията на “sfDoctrineForkedApply” информацията за потребителя се съхранява в таблицата sf_guard_user_profile. За да добавите допълнителни полета е необходимо да отидете в /plugins/sfForkedDoctrineApplyPlugin/config/doctrine/schema.yml
schema.yml
От тук можете да добавяте и променяте полета в таблицата. Не забравяйте след това да заредите промените с:

symfony doctrine:build --all --and-load

sfGuard в уеб проекти
Имайте предвид, че всичко въведено до момента в базата данни ще бъде изтрито. Ще е необходимо да създадете отново супер-администратор. Ако не сте запознати с формите горещо препоръчвам тези материали :
Day 10: The Forms
Symfony Forms
Можете да моделирате вашите форми от тук: /plugins/sfForkedDoctrineApply/lib/forms/
Тук са всички форми, които са ви необходими. Разбира се необходимо е да сложите джаджи и валидатори според нуждите си и според това какви полета сте въвели в базата данни. С малко практика всичко ще се получи. Относно визуалното представяне на формите, трябва да влезете тук:
/plugins/sfForkedDoctrineApply/modules/templates/
_loginPromt.php показва формите за вход
_logoutPromt.php показва изхода на данните след като сте влезли с вашето потребителско име и парола .
_settingsSuccess.php показва формите за промяна на данни на потребителя
_resetLogged.php показва формите за смяна на парола на потребителя след като е влезнал.
Наблягам на тези четири файла, защото те са основните, след това ще добиете представа как да променяте и стилизирате другите елементи според. Нещо малко, но необходимо да се знае. Когато използвате тази функция.

include_component('sfApply', 'login');

При неправилно въведени данни за username” и “password” системата ви пренасочва към основния темплеайт на SfDoctrineGuard. За да избегнем показването на две форми за вход трябва да отидем тук :
plugins/sfDoctrineGuardPlugin/modules/templates/_singin_form.php
Symfony в уеб проекти
В началото на файла добавяме това:

slot('sf_apply_login')
end_slot()

Така деактивираме формите за вход от sfForkedApply и след като системата ви пренасочи поради неправилно въведените данни ще се зареди само една форма. Този код може да използвате и в страниците , където не е необходимо да следите статуса на потребителя (дали е логнат или не). Сега имате всички необходими елементи , чрез които може да програмирате защитата на “frontend-а” на вашия уеб сайт.
Последната част от урока е за това, как да администрирате потребителите, групите и правата в sfGuard в “backend” приложението. Като начало, трябва да сте запознати с изграждането на “backend”, ако не сте този урок е за вас:
Day 12: The Admin Generator
След като сте създали “backend” приложението и сте запознати с основните елементи отидете в backend/config/settings.yml В частта за разрешените модули можете да програмирате:

all:
  .settings:
  enabled_modules: [default,sfGuardGroup, sfGuardUser, sfGuardPermission]

След това идете в backend/templates/layout.php
Добавете следните редове:

echo link_to('Users', 'sf_guard_user');
echo link_to('Permissions', 'sf_guard_permission');
echo link_to('Групи', 'sf_guard_group');

По този начин може да създавате права и групи, с които да контролирате достъпа на потребителите до отделни елементи на страницата ви. Също така ще имате достъп до таблицата с регистрираните потребители. Защитата на определена страница или цял модул с права става лесно. След създаването на дадената категория потребител, давате тази „титла” на всеки потребител, който трябва да има достъп до страница с определени права. След това във “frontend” приложението в security.yml на модула, който защитавате добавяте нещо подобно на следното, в зависимост от вашите нужди :

all:
  is_secure: true
  new:
    is_secure: true
    credentials: [users]
  edit:
    is_secure: true
    credentials: [[creator ,administrator ]]
  delete:
    is_secure: true
    credentials: [[creator ,administrator ]]

Тези редове са просто пример, как поотделно можете да забраните или разрешите достъпа на дадена група потребители с credentials. Ако искате при регистрацията на потребител да му се присвояват автоматично права, трябва да отидете в:
plugins/sfForkedDoctrineApplyPlugin/lib/form/sfApplyApplyForm.class.php
Symfony sfApply plugin
в края на файла има функция с име : public function doSave
Ако сте създали в permission примерно права с име user добавете следните редове:

public function doSave($con = null) {
   .......
   $permission = new sfGuardUserPermission();
   $permission->setPermissionId('1');
   $permission->setUserId($user->getId());
   $permission->save();

   return parent::doSave($con);
}

Така всеки нов регистриран потребител, ще има права на достъп “user” и ще може да посещава единствено модулите и страниците в тях, които изискват такива права или нямат зададени. За повече информация относно това прочетете официалната документация на sfDoctrineGuard. В статията се опитах да обясня основите при работа с тези добавки. Като цяло те са недостатъчни, но се надявам да ви помогнат по-лесно да навлезете в тази не лека материя и да ви помогне за по-добра изработка на уеб сайтове от ваша страна.

3 thoughts on “Програмиране на SfGuard в проекти на Symfony

  1. Hi.Thank you for this post. It helped me to urnanstedd how it works when you want to use multiple Entity Manager or define further configurations for the default Entity Manager.I had the same exception like you, but I found a more general solution.You can add the ‘mapping_auto’ option to the doctrine.orm.entity_managers.[manager] directive.Like this:doctrine.orm.entity_managers.[manager].auto_mapping: trueThe advantag is, that you do not need to explicitly define the bundles where you want to use the Manager.

  2. Здравейте, това наистина интересно, благодарение cholakovit.com

Вашият коментар

Вашият email адрес няма да бъде публикуван Задължителните полета са отбелязани с *