Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][Symfony2][SF2]Tworzenie i sprawdzanie sesji
Forum PHP.pl > Forum > PHP > Frameworki
dawid22441
Witam

W "normalnym" programowaniu mam takie zabezpieczenie :
  1. if( !isset( $_SESSION['nick'] ) )
  2. exit("brak uprawnień");

zmienna sesyjna nick byla tworzona podczas logowania , jesli znaleziono uzytkownika o podanych parametrach to tworzono ta zmienna i przechodzilo sie do podanego pliku.

jak takie sprawdzanie i tworzenie sesji przy logowaniu stworzyc w SF2?

Pozdrawiam

Probowalem tak :

  1. $session = new Session();
  2. $session->start();
  3. $session->set('name', 'Test');


wczesniej dodalem
  1. use Symfony\Component\HttpFoundation\Session\Session;


w pliku widoku chcialem wyswietlic sesje wiec zrobilem
  1. return $this->render('dawidCmsBundle:Page:session.html.twig', array(
  2. 'name' => $session->get('name')
  3. ) );


plik twig:
  1. name: {{app.session.name}}

jednak dostaje komunikat:Failed to start the session: already started by PHP.
kapslokk
  1. $session = $request->getSession();

Z tym, że musisz mieć Request $request jako parametr akcji.

Więcej tutaj:
http://symfony.com/doc/current/book/controller.html
Szukaj "Managing the Session"
dawid22441
super
  1. $session = $this->get('session');


działa

tylko mam pytanie ,zalozmy ze mam kilka metod ,w kilku roznych kontrolerach.

zalozmy ze w jednej tworze sesje, a chcialbym ja sprawdzac we wszystkich

wiec we wszystkich metodach musze pisac na starcie
  1. $session = $this->get('session');
  2. $session->start();


czy moze istnieje szybsze rozwiazanie ?
kapslokk
Edytowałem post i wrzuciłem tam $session = $request->getSession(); . Tego powinieneś używać, nie będziesz musiał startować sesji
dawid22441
oki ,dzieki za pomoc smile.gif

tylko powiedz mi czy jesli w kontrolerze mam przykladowo 10 metod to w kazdej musze to wklejac:
$session = $request->getSession();
?
nie ma opcji aby to jakos odwolywalo sie do wszystkich metod ?
kapslokk
Nie jestem pewien czy to zadziała, ale możesz spróbować w konstruktorze kontrolera zrobić
$this->session = $request->getSession(); i później w metodach używać $this->session. Ale tak jak mówie - nie jestem pewien, nigdy nie testowałem.
dawid22441
oki, sprawdze potem

mam jeszcze pytanie odnosnie tego jak sprawdzic w pliku twig czy dana sesja istnieje ?
normalnie robie to tak if( isset( $_SESSION['name'] ) )

probowalem tak:
{% if app.session.get('name') is defined %}

test

{% endif %}

jednak to nie dziala, wyswietla test nawet gdy sesji nie ma
kapslokk
Może {% if app.session.get('name') is not null %}? Zależy co chcesz sprawdzić. Możesz też przypisać sobie w kontrolerze odpowiednią zmienną pobierając ją z sesji.
dawid22441
tak, juz przypisalem .

stworzylem tez konstruktor i w nim chcialem sobie ustawic zmienna _session jednak dostaje blad

konstruktor wyglada tak:

  1. private $_session;
  2.  
  3. public function __construct(Request $request) {
  4. $this->_session = $request->getSession();
  5. }


a komunikat:

Catchable Fatal Error: Argument 1 passed to dawid\CmsBundle\Controller\PageController::__construct() must be an instance of Symfony\Component\HttpFoundation\Request, none given, called in /home/dawid_t/ftp/symfony/symfony/app/cache/dev/classes.php on line 2220 and defined

wiesz moze czy da sie to jakos naprawic ?
kapslokk
No tak jak mi się zdawało - nie działa tongue.gif Raczej nie naprawisz : )
dawid22441
no to ze nie działa to widze biggrin.gif

czyli nie ma opcji zeby to jakos usprawnic?

troche lipa w kazdej metodzie wpisywac to samo smile.gif

http://symfony.com/doc/current/cookbook/fo...pe-as-a-service

tutaj mozna jakos ustawic konstruktor
kapslokk
Ale to jest do serwisów a nie kontrolerów.
dawid22441
no trudno, dzieki za pomoc smile.gif
kpt_lucek
Czekaj, czekaj... nie bardzo rozumiem co chcesz osiągnąć?

---EDIT

Dobra, chyba zrozumiałem...

Ogólnie to chodzi Ci o sprawdzanie:
- Czy użytkownik jest zalogowany
  1. // Controller
  2. // Pobierz token
  3. $token = $this->get('security.token_storage')->getToken();
  4. if(null !== $token && $token->getUser() instanceof UserInterface){
  5. //zalogowany
  6. }

- Czy użytkownik posiada uprawnienia do X
  1. // Controller
  2.  
  3. $authorizationChecker = $this->get('security.authorization_checker')
  4. if(true === $authorizationChecker->isGranted('ROLE_X')){
  5. // posiada uprawnienie
  6. }


W przypadku 2go rozwiązania (sprawdzanie uprawnień) nie musisz sprawdzać czy użytkownik jest zalogowany (nie musisz wykonywać obu sprawdzeń).

Dodatkowo tutaj(2gi sample) masz opcję przez adnotacje (im więcej w serwisie tym wolniej).



Jeżeli robiłeś sprawdzanie "zalogowania" inaczej, to robiłeś to źle, albo inaczej... nie tak jak mogłeś czy też powinieneś.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.