Ota käyttöön oma SecurityController
Verkkotoimisto » Digitaalisia uutisia » Ota käyttöön oma SecurityController

Ota käyttöön oma SecurityController

Kirjoitin äskettäin yritykselleni artikkelin käyttäjien hallinnasta ja heidän todennustaan ​​käyttämällä Symfony2 Corea natiivisti ja siten ilman FOSUserBundlea. Tämän jo ennestään runsaan ensimmäisen artikkelin jälkeen halusin kuvata yhtä hyödyllisen toisen osan, jonka avulla voimme nopeasti määrittää olennaiset toiminnot, nimittäin salasanan nollauksen, salasanan vaihtamisen, tilisi vahvistamisen tai jopa rekisteröitymisen. Toiminnot ovat yhtä tärkeitä, kun käytössäsi on käyttäjiä hallitseva järjestelmä.

Aseta SecurityController

Ensinnäkin, jos et ole seurannut ensimmäistä opetusohjelmaa käyttäjien hallinnan määrittämisestä, suosittelen tutustumaan. Jos noudatit ratkaisua, sinulla pitäisi loogisesti olla SecurityController tai jotain muuta. Minun tapauksessani minulla on vain kolme menetelmää, joista vain yksi on todella käyttökelpoinen.

  1. kirjautumistoiminto
    Tämä menetelmä yhdistää käyttäjän.
  2. tarkistaAction
    Tällä menetelmällä voit yksinkertaisesti määrittää reitin palomuurille, jolloin käyttäjä voi muodostaa yhteyden palvelinpuolella.
  3. uloskirjautuminenAction
    Tätä menetelmää käytetään määrittämään palomuurin reitti, jonka avulla käyttäjä voi katkaista yhteyden.

Avaa alustamme uusille käyttäjille

Olisi erityisen mielenkiintoista, jos käyttäjämme voisivat muodostaa yhteyden ja siten rekisteröityä etukäteen.

Ensin luomme lomakkeen, joka sisältää tiedot, joita haluat kysyä käyttäjältäsi.

Mitä tulee lomakkeeseen, jota käytät käyttäjäsi rekisteröintiin, tiedä, että kenttä" salasana ei pitäisi olla sinun muodossasi. Sinun on kuitenkin lisättävä kaksi kenttää " ei kartoitettu jotta haluttu salasana syötetään kahdesti.

1
2
3
4
5
6
7
8
9
10
11
12
13
/ **
 * @Menetelmä({"SAADA"})
 * @tie("/register", nimi="rekisteröinti")
 * @Turvallinen(roolit=”IS_AUTHENTICATED_ANONYMOUSLY”)
 * @Sapluuna()
 */
julkinen toiminto ilmoittautua()
{
    $lomake = $ tätä->createForm(uusi UserType(Käyttäjätyyppi::REKISTERI), uusi Käyttäjä());
    palata ryhmä(
        "muoto" => $form->createView(),
        );
}

Sitten kun käyttäjäsi palaa lomakkeensa täytettynä, meidän on rekisteröitävä hänet tai hylättävä hänen tiedostonsa :p

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/ **
* @Menetelmä({"LÄHETTÄÄ"})
* @tie("/rekisteröidy")
* @Turvallinen(roolit=”IS_AUTHENTICATED_ANONYMOUSLY”)
* @Sapluuna()
*/
julkinen toiminto Rekisteröidy nyt(Pyyntö $pyyntö)
{
$params = $pyyntö->pyyntö->kaikki()["lomakkeen_nimi"];
$lomake = $ tätä->createForm(uusi UserType(Käyttäjätyyppi::REKISTERI), uusi Käyttäjä());
$lomake->lähetä($pyyntö);
if (array_key_exists("plain_password", $params) && array_key_exists("plain_password2", $params) && $params["plain_password"] == $params["plain_password2"]) {
if ($form->isValid()) {
$tiedot = $lomake->getData();
$data->setPassword($ tätä->container->get("security.encoder_factory")->getEncoder($data)->encodePassword($params["plain_password"], $data->getSalt()));
$em->persist($data);
$em->flush();
palata $ tätä->uudelleenohjaus($ tätä->generateUrl("Kirjaudu sisään", ryhmä("viesti" => "Olet saanut sähköpostin tilisi vahvistamiseksi. »)));
}
}
palata ryhmä(
"virheet" => $params["plain_password"] == $params["plain_password2"]? $form->getErrors(): ryhmä("Kahden salasanan on oltava samat"),
"muoto" => $form->createView(),
);
}

Tässä kerromme nopeasti yksityiskohtaisesti työnkulku rekisteröidäksesi uuden käyttäjän.

  1. Me katsomme jos kaikki vaaditut kentät on täytetty oikein, mukaan lukien kaksi "salasana"-kenttää, ja jos kaksi jälkimmäistä ovat identtisiä.
  2. Koodaamme salasanan ja "asetamme" sen entiteettiin.
  3. Mahdollisen virheen sattuessa palautamme lomakkeen virheen kanssa, jonka mielestämme pitäisi olla yksityiskohtainen.

Luo ominaisuus salasanan nollaamiseksi

Nyt käyttäjä voi kirjautua sisään, mutta mitä teemme, jos hän kadottaa salasanansa. On selvää, että emme aio perustaa sen turhalle toiminnalle omistettua yhteyssähköpostiosoitetta.

Kuten yllä olet nähnyt, ilmoitan yleensä kaksi menetelmää kullekin toiminnalleni: yksi menetelmistäni vastaa pyynnön jälkeen luodun näkymän hallinnasta SAA ja pyynnön seurauksena POST. Voit ehdottomasti yhdistää nämä kaksi menetelmää yhdeksi ja samaksi menetelmäksi.

1
2
3
4
5
6
7
8
9
/ **
  * @Menetelmä({"SAADA"})
  * @tie("/reset", nimi="reset"
  * @Turvallinen(roolit=”IS_AUTHENTICATED_ANONYMOUSLY”)
  * @Sapluuna()
  */
  julkinen toiminto nollata() {
   palata ryhmä();
  }

Toisessa vaiheessa ilmoitamme pyyntöjen hallinnan täydentävän menetelmän POST.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/ **
* @Menetelmä({"LÄHETTÄÄ"})
* @tie("/reset"
* @Turvallinen(roolit=”IS_AUTHENTICATED_ANONYMOUSLY”)
*/
julkinen toiminto resetNow(Pyyntö $pyyntö)
{
$params = $pyyntö->pyyntö->kaikki();
if (!array_key_exists("Kirjaudu sisään", $params)) {
heittää uusi Poikkeus("Kirjautumistunnusta ei annettu");
}
$login = &$params["Kirjaudu sisään"];
$em = $ tätä->container->get("doctrine.orm.default_entity_manager");
$user = $em->getRepository("NamespaceMyBundle:User")->findOneBy(ryhmä("Kirjaudu sisään" => $kirjautuminen));
if ($käyttäjä == nolla) {
palata $ tätä->uudelleenohjaus($ tätä->generateUrl("Kirjaudu sisään", ryhmä()));
}
$salasana = "myRandowPassword";
$user->setPassword($ tätä->container->get("security.encoder_factory")->getEncoder($user)->encodePassword($salasana, $käyttäjä->getSalt()));
$em->persist($user);
$em->flush();
// Lähetämme salasanan sähköpostitse
palata $ tätä->uudelleenohjaus($ tätä->generateUrl("Kirjaudu sisään", ryhmä()));
}

Tämä menetelmä on suunniteltu nollaa salasanansa antaneen käyttäjän salasana kirjautumistunnus/käyttäjänimi. Minun tapauksessani salasana lähetettiin sitten sähköpostitse. Annan sinun lisätä tuon rohkean rivin.

  1. Joten mennään haun käyttäjä.
  2. Luomme salasanan että tulemme ilmoittamaan käyttäjälle, kun hän on koodannut määrittämiesi sääntöjen mukaisesti.

Määritä salasanan vaihto

Tässä vaiheessa käyttäjämme voi luoda uuden salasanan, jos se on kadonnut, mutta jos hän vain haluaa vaihtaa sen, tarvitsemme portin portin määrittelemiseksi.

1
2
3
4
5
6
7
8
9
/ **
* @Menetelmä({"SAADA"})
* @tie("/muutos", nimi="muuta-salasana"
* @Turvallinen(roolit=”IS_AUTHENTICATED_FULLLY”)
* @Sapluuna()
*/
julkinen toiminto muuttaa() {
palata ryhmä();
}

Tässä on koodi näkymän luomiseksi. Ensin sinun on syötettävä vanha salasanasi ja sitten uusi salasana kahdesti. Toinen kerta vahvistus.

Nyt näemme koodin nollaaja salasana. THE prosessi on samanlainen kuin uuden satunnaisen salasanan luominen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/ **
 * @Menetelmä({"LÄHETTÄÄ"})
 * @tie("/muuttaa")
 * @Turvallinen(roolit=”IS_AUTHENTICATED_FULLLY”)
 * @Sapluuna()
 */
julkinen toiminto muuta nyt(Pyyntö $pyyntö)
{
    $params = $pyyntö->pyyntö->kaikki();
    if (!array_key_exists("nykyinen", $params)
        || !array_key_exists("Uusi", $params)
        || !array_key_exists("uusi 2", $params))
    {
        palata ryhmä("virhe" => "Täytä kaikki kentät");
    }
    $em = $ tätä->container->get("doctrine.orm.default_entity_manager");
    $käyttäjä= $ tätä->getUser();
    $user_encoders = $ tätä->container->get("security.encoder_factory")->getEncoder($käyttäjä);
    $user_repository = $em->getRepository("NamespaceMyBundle:User");
    $current_password_encoded = $user_encoders->encodePassword($params["nykyinen"], $user->getSalt());
    $new_password_encoded = $user_encoders->encodePassword($params["Uusi"], $user->getSalt());
    if ($user_repository->findOneBy(ryhmä("Salasana" => $nykyinen_salasana_koodattu)) == nolla) {
        palata ryhmä("virhe" => "Nykyinen salasana on väärä");
    } elseif ($params["Uusi"] != $params["uusi 2"]) {
        palata ryhmä("virhe" => "Kahden kentän salasana eivät ole samat");
    }
    $user->setPassword($new_password_encoded);
    $em->persist($user);
    $em->flush();
    palata $ tätä->uudelleenohjaus($ tätä->generateUrl("kirjautua ulos", ryhmä()));
}

Jos käytät 1 minuutin koodin lukemiseen, huomaat, että tämä on erityisen yksinkertainen.

  1. Tarkistamme ensin, että kolme kenttää (vanha salasana, uusi salasana ja vahvistus) on syötetty oikein.
  2. On syötä salasana nykyinen ja vertaamme sitä nykyiseen salasanaantarkastaa, vastaako se syötettyä vanhaa salasanaa.
  3. Tarkistamme, ovatko "kaksi" uutta salasanaa identtinen.
  4. Syötä uusi salasana ja työntää entiteetissä.

Hänen tilinsä aktivointi

Tämä ominaisuus ei ole täysin yksityiskohtainen muissa katkelmia edellä. Sen tarkoituksena on poistaa juuri rekisteröityneen käyttäjän esto, kun hän on esimerkiksi vahvistanut sähköpostinsa. Tämä toiminto on kehitetty lähes kaikille tuntemillemme alustoille useista syistä. Jos haluat määrittää käyttäjän eston, sinun on ehkä otettava käyttöön myös palveluntarjoaja.

  • lohko/limit tilit väärennös ja spam.
  • Verifier että käyttäjä on antanut sähköpostiosoitteen, joka näyttää käyttökelpoiselta ensi silmäyksellä.
  • Poistaa tilit, joita ei ole vahvistettu tietyn ajan kuluttua.

Työnkulku

  1. Käyttäjä rekisteröityy. Tämän jälkeen hänen tilinsä estetään sinua koskevan kentän kautta. Tämän kentän pitäisi estää häntä muodostamasta yhteyttä niin kauan kuin tämä kenttä osoittaa, että tili on poistettu käytöstä.
1
2
3
4
5
6
7
8
// NimitilaMyBundleEntityUser
luokka käyttäjä {
julkinen toiminto __rakentaa() {
$ tätä->token = hash("sha512", uniqid());
}
...
}
1
$user->setEnabled(väärä);
  1. Käyttäjä sai sähköpostin, kun hänen profiilinsa oli huuhtele tietokannassa. Tämän sähköpostin on oltava osa luomaasi osoitetta.
    Tällä tiellä a token tai yksilöivä tunniste on annettava, jotta kyseinen käyttäjä voidaan löytää. Suosittelen käyttämään UUID4:ää, joka on tarkoitettu satunnaiseksi. Löydät luettelon UUID-tunnisteista sekä kuvauksen kaikista versioista.
1
2
3
4
/ **
* @tie(“/aktivoida”, nimi=”aktivoida”)
*/
julkinen toiminto aktivoida() {…}
1
$ tätä->generateUrl("aktivoida", ryhmä(« token » => $user->getToken()), totta);

Sinulla pitäisi olla tällainen URL-osoite.

1
http://isäntänimi/aktivoida?token=AinutlaatuinenToken
  1. Käyttäjä avaa sähköpostinsa ja yrittää aktivoida tilinsä napsauttamalla annettua linkkiä. Siirrymme sitten alla olevaan prosessiin.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/ **
 * @Menetelmä({"SAADA"})
 * @tie(“/aktivoida”, nimi=”aktivoida”)
 * @Turvallinen(roolit=”IS_AUTHENTICATED_ANONYMOUSLY”)
 * @Sapluuna()
 */
julkinen toiminto aktivoida(Pyyntö $pyyntö) {
    $params = ryhmä();
    $token = $pyyntö->kysely->get(« token »);
    $em = $ tätä->container->get("doctrine.orm.default_entity_manager");
$user = $em->getRepository("NamespaceMyBundle:User")->findOneBy(ryhmä(« token » => $token));
    if ($käyttäjä != nolla) {
        $user->setEnabled(totta);
        $em->persist($user);
        $em->flush();
        $params["aktivoida"] = totta;
    } muu {
        $params["aktivoida"] = väärä;
    }
    palata $params;
}

Tämän prosessin avulla sinulla ei pitäisi olla ongelmia ottaa käyttöön käyttäjätilin vahvistus.

Löydät tämän vastaavan koodin tästä sisällöstä.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
<?php
käyttää JMSSecurityExtraBundlehuomautusTurvata;
käyttää SensioNiputtaaFrameworkExtraBundlekokoonpanoMenetelmä;
käyttää SensioNiputtaaFrameworkExtraBundlekokoonpanoReitti;
käyttää SensioNiputtaaFrameworkExtraBundlekokoonpanoSapluuna;
käyttää SymfonyNiputtaaFramework Bundleohjainohjain;
käyttää SymfonykomponenttiHttp-säätiöPyydä;
käyttää SymfonykomponenttiturvallisuusYdinSecurityContext;
luokka SecurityController ulottuu ohjain
{
/ **
* @Menetelmä({"SAADA"})
* @tie("/login", nimi="kirjautuminen"
* @Sapluuna()
*/
julkinen toiminto Kirjaudu sisään(Pyyntö $pyyntö)
{
$pyyntö = $ tätä->getRequest();
$session = $request->getSession();
if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
$error = $pyyntö->attribuutit->get(SecurityContext::AUTHENTICATION_ERROR);
} muu {
$virhe = $session->get(SecurityContext::AUTHENTICATION_ERROR);
$session->remove(SecurityContext::AUTHENTICATION_ERROR);
}
$params = ryhmä(
"last_username" => $session->get(SecurityContext::LAST_USERNAME),
"virhe" => $error,
"viesti" => $pyyntö->get("viesti"),
);
if ($request->isXmlHttpRequest()) {
palata $ tätä-> renderöi("GCDirectoryMainBundle:Security:login-ajax.html.twig", $params);
}
palata $params;
}
/ **
* @Menetelmä({"LÄHETTÄÄ"})
* @tie("/login_check", nimi="login_check"
*/
julkinen toiminto tarkastaa()
{
heittää uusi RuntimeException ("Sinun on määritettävä palomuurin käsittelemä tarkistuspolku käyttämällä form_login-parametria suojauspalomuuriasetuksissa.");
}
/ **
* @Menetelmä({"SAADA"})
* @tie("/logout", nimi="logout"
*/
julkinen toiminto logout()
{
heittää uusi RuntimeException ("Sinun on aktivoitava uloskirjautuminen suojauspalomuuriasetuksissa.");
}
/ **
* @Menetelmä({"SAADA"})
* @tie("/reset", nimi="reset"
* @Turvallinen(roolit=”IS_AUTHENTICATED_ANONYMOUSLY”)
* @Sapluuna()
*/
julkinen toiminto nollata() {
palata ryhmä();
}
/ **
* @Menetelmä({"LÄHETTÄÄ"})
* @tie("/reset"
* @Turvallinen(roolit=”IS_AUTHENTICATED_ANONYMOUSLY”)
*/
julkinen toiminto resetNow(Pyyntö $pyyntö)
{
$params = $pyyntö->pyyntö->kaikki();
if (!array_key_exists("Kirjaudu sisään", $params)) {
heittää uusi Poikkeus("Kirjautumistunnusta ei annettu");
}
$login = &$params["Kirjaudu sisään"];
$em = $ tätä->container->get("doctrine.orm.default_entity_manager");
$user = $em->getRepository("NamespaceMyBundle:User")->findOneBy(ryhmä("Kirjaudu sisään" => $kirjautuminen));
if ($käyttäjä == nolla) {
palata $ tätä->uudelleenohjaus($ tätä->generateUrl("Kirjaudu sisään", ryhmä()));
}
$salasana = "myRandowPassword";
$user->setPassword($ tätä->container->get("security.encoder_factory")->getEncoder($user)->encodePassword($salasana, $käyttäjä->getSalt()));
$em->persist($user);
$em->flush();
palata $ tätä->uudelleenohjaus($ tätä->generateUrl("Kirjaudu sisään", ryhmä()));
}
/ **
* @Menetelmä({"SAADA"})
* @tie("/muutos", nimi="muuta-salasana"
* @Turvallinen(roolit=”IS_AUTHENTICATED_FULLLY”)
* @Sapluuna()
*/
julkinen toiminto muuttaa() {
palata ryhmä();
}
/ **
* @Menetelmä({"LÄHETTÄÄ"})
* @tie("/muuttaa")
* @Turvallinen(roolit=”IS_AUTHENTICATED_FULLLY”)
* @Sapluuna()
*/
julkinen toiminto muuta nyt(Pyyntö $pyyntö)
{
$params = $pyyntö->pyyntö->kaikki();
if (!array_key_exists("nykyinen", $params)
|| !array_key_exists("Uusi", $params)
|| !array_key_exists("uusi 2", $params))
{
palata ryhmä("virhe" => "Täytä kaikki kentät");
}
$em = $ tätä->container->get("doctrine.orm.default_entity_manager");
$käyttäjä= $ tätä->getUser();
$user_encoders = $ tätä->container->get("security.encoder_factory")->getEncoder($käyttäjä);
$user_repository = $em->getRepository("NamespaceMyBundle:User");
$current_password_encoded = $user_encoders->encodePassword($params["nykyinen"], $user->getSalt());
$new_password_encoded = $user_encoders->encodePassword($params["Uusi"], $user->getSalt());
if ($user_repository->findOneBy(ryhmä("Salasana" => $nykyinen_salasana_koodattu)) == nolla) {
palata ryhmä("virhe" => "Nykyinen salasana on väärä");
} elseif ($params["Uusi"] != $params["uusi 2"]) {
palata ryhmä("virhe" => "Kahden kentän salasana eivät ole samat");
}
$user->setPassword($new_password_encoded);
$em->persist($user);
$em->flush();
palata $ tätä->uudelleenohjaus($ tätä->generateUrl("kirjautua ulos", ryhmä()));
}
/ **
* @Menetelmä({"SAADA"})
* @tie("/register", nimi="rekisteröinti")
* @Turvallinen(roolit=”IS_AUTHENTICATED_ANONYMOUSLY”)
* @Sapluuna()
*/
julkinen toiminto ilmoittautua()
{
$lomake = $ tätä->createForm(uusi UserType(Käyttäjätyyppi::REKISTERI), uusi Käyttäjä());
palata ryhmä(
"muoto" => $form->createView(),
);
}
/ **
* @Menetelmä({"LÄHETTÄÄ"})
* @tie("/rekisteröidy")
* @Turvallinen(roolit=”IS_AUTHENTICATED_ANONYMOUSLY”)
* @Sapluuna()
*/
julkinen toiminto Rekisteröidy nyt(Pyyntö $pyyntö)
{
$params = $pyyntö->pyyntö->kaikki()["lomakkeen_nimi"];
$lomake = $ tätä->createForm(uusi UserType(Käyttäjätyyppi::REKISTERI), uusi Käyttäjä());
$lomake->lähetä($pyyntö);
if (array_key_exists("plain_password", $params) && array_key_exists("plain_password2", $params) && $params["plain_password"] == $params["plain_password2"]) {
if ($form->isValid()) {
$tiedot = $lomake->getData();
$data->setPassword($ tätä->container->get("security.encoder_factory")->getEncoder($data)->encodePassword($params["plain_password"], $data->getSalt()));
$em->persist($data);
$em->flush();
palata $ tätä->uudelleenohjaus($ tätä->generateUrl("Kirjaudu sisään", ryhmä("viesti" => "Olet saanut sähköpostin tilisi vahvistamiseksi. »)));
}
}
palata ryhmä(
"virheet" => $params["plain_password"] == $params["plain_password2"]? $form->getErrors(): ryhmä("Kahden salasanan on oltava samat"),
"muoto" => $form->createView(),
);
}
/ **
* @Menetelmä({"SAADA"})
* @tie(“/aktivoida”, nimi=”aktivoida”)
* @Turvallinen(roolit=”IS_AUTHENTICATED_ANONYMOUSLY”)
* @Sapluuna()
*/
julkinen toiminto aktivoida(Pyyntö $pyyntö) {
$params = ryhmä();
$token = $pyyntö->kysely->get(« token »);
$em = $ tätä->container->get("doctrine.orm.default_entity_manager");
$user = $em->getRepository("NamespaceMyBundle:User")->findOneBy(ryhmä(« token » => $token));
if ($käyttäjä != nolla) {
$user->setActive(Käyttäjä::ACTIVE_ACTIVE);
$em->persist($user);
$em->flush();
$params["aktivoida"] = totta;
} muu {
$params["aktivoida"] = väärä;
}
palata $params;
}
}

★ ★ ★ ★ ★