Implimenta SecurityController tiegħek stess
Aġenzija tal-web » Aħbarijiet diġitali » Implimenta SecurityController tiegħek stess

Implimenta SecurityController tiegħek stess

Dan l-aħħar ktibt artiklu għall-kumpanija tiegħi dwar il-ġestjoni tal-utenti u l-awtentikazzjoni tagħhom billi tuża Symfony2 Core b'mod nattiv, u għalhekk mingħajr FOSUserBundle. Wara dan l-ewwel artiklu diġà għani, ridt niddeskrivi t-tieni parti ugwalment utli li tippermettilna nwaqqfu malajr il-funzjonijiet essenzjali, jiġifieri, nissettjaw mill-ġdid il-password tiegħek, nibdlu l-password tiegħek, nivvalidaw il-kont tiegħek jew saħansitra nirreġistraw. Azzjonijiet daqstant essenzjali meta jkollok sistema li tmexxi l-utenti.

Stabbilixxi SecurityController

L-ewwel, jekk ma segwejtx l-ewwel tutorja dwar kif twaqqaf il-ġestjoni tal-utenti, nagħtik parir biex tagħti ħarsa. Jekk segwejt is-soluzzjoni, loġikament għandu jkollok SecurityController jew xi ħaġa oħra. Fil-każ tiegħi, għandi biss tliet metodi, li wieħed biss minnhom huwa verament użabbli.

  1. loginAzzjoni
    Dan il-metodu jgħaqqad utent.
  2. checkAction
    Dan il-metodu sempliċiment jippermettilek li tiddikjara rotta għall-firewall, li tippermetti lill-utent jikkonnettja fuq in-naħa tas-server.
  3. logoutAction
    Dan il-metodu jintuża biex tiddikjara rotta għall-firewall li tippermetti li utent jiġi skonnettjat.

Iftaħ il-pjattaforma tagħna għal utenti ġodda

Ikun partikolarment interessanti jekk l-utenti tagħna jkunu jistgħu jgħaqqdu, u għalhekk ikunu jistgħu jirreġistraw minn qabel.

L-ewwel, niġġeneraw il-formola bl-informazzjoni li trid titlob lill-utent tiegħek.

Rigward il-formola li se tuża biex tirreġistra l-utent tiegħek, taf li l-għalqa " password m'għandux ikun fil-forma tiegħek. Madankollu, ser ikollok bżonn iżżid żewġ oqsma " mhux immappjat sabiex ikollok il-password mixtieqa mdaħħla darbtejn.

1
2
3
4
5
6
7
8
9
10
11
12
13
/ **
 * @Metodu({“GET”})
 * @Triq(“/reġistru”, isem="reġistru")
 * @Sikura(rwoli=”IS_AUTHENTICATED_ANONYMOUSLY”)
 * @Mudell()
 */
pubblika funzjoni reġistru()
{
    $forma = $ dan->createForm(ġdid UserType(UserType::REGISTER), ġdid Utent());
    ritorn firxa(
        "forma" => $form->createView (),
        );
}

Imbagħad, huwa meta l-utent tiegħek jiġi lura bil-formola tiegħu mimlija li jkollna nirreġistrawh jew niċħdu l-fajl tiegħu :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
/ **
* @Metodu({“POST”})
* @Triq(“/reġistru”)
* @Sikura(rwoli=”IS_AUTHENTICATED_ANONYMOUSLY”)
* @Mudell()
*/
pubblika funzjoni Irreġistra issa(Talba $ talba)
{
$params = $talba->talba->kollha()[“isem_tal-forma_tiegħi”];
$forma = $ dan->createForm(ġdid UserType(UserType::REGISTER), ġdid Utent());
$form->submit($talba);
if (array_key_exists(“plain_password”, $params) && array_key_exists(“plain_password2”, $params) && $params[“plain_password”] == $params[“plain_password2”]) {
if ($form->isValid()) {
$data = $form->getData ();
$data->setPassword($ dan-> kontenitur-> tikseb (“security.encoder_factory”)->getEncoder($data)->encodePassword($params[“plain_password”], $data->getSalt()));
$em->persistu($data);
$em-> flush();
ritorn $ dan-> indirizz mill-ġdid ($ dan->generateUrl("Idħol", firxa("messaġġ" => “Int irċevejt email biex tivvalida l-kont tiegħek. »)));
}
}
ritorn firxa(
"żbalji" => $params[“plain_password”] == $params[“plain_password2”]? $form->getErrors(): firxa("Iż-żewġ passwords għandhom ikunu l-istess"),
"forma" => $form->createView (),
);
}

Hawnhekk aħna se malajr dettalji l- fluss tax-xogħol biex tirreġistra utent ġdid.

  1. Aħna nħarsu jekk l-oqsma kollha meħtieġa jiddaħħlu b'mod korrett, inklużi ż-żewġ oqsma "password", u jekk it-tnejn tal-aħħar huma identiċi.
  2. Aħna nikkodifikaw il-password u aħna "settjah" fl-entità.
  3. F'każ ta' xi żball, nirritornaw il-formola bl-iżball li naħsbu li għandu jkun iddettaljat.

Oħloq karatteristika biex tirrisettja l-password tiegħek

Issa l-utent tiegħek jista' jidħol imma x'se nagħmlu jekk jitlef il-password tiegħu. Huwa ovvju li mhux se nwaqqfu indirizz elettroniku ta 'kuntatt iddedikat għall-operazzjonijiet inutli tiegħu.

Kif rajt hawn fuq, normalment niddikjara żewġ metodi għal kull waħda mill-funzjonalitajiet tiegħi: wieħed mill-metodi tiegħi huwa responsabbli għall-ġestjoni tal-veduta maħluqa wara talba IKOLLOK u riżultat ta’ talba POST. Tista 'assolutament tikkonkatena dawn iż-żewġ metodi fl-istess metodu wieħed.

1
2
3
4
5
6
7
8
9
/ **
  * @Metodu({“GET”})
  * @Triq(“/reset”, isem =”reset”)
  * @Sikura(rwoli=”IS_AUTHENTICATED_ANONYMOUSLY”)
  * @Mudell()
  */
  pubblika funzjoni reset() {
   ritorn firxa();
  }

Fit-tieni pass, aħna se niddikjaraw il-metodu kumplimentari li jamministra t-talbiet 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
/ **
* @Metodu({“POST”})
* @Triq(“/reset”)
* @Sikura(rwoli=”IS_AUTHENTICATED_ANONYMOUSLY”)
*/
pubblika funzjoni reset Issa(Talba $ talba)
{
$params = $talba->talba->kollha();
if (!array_key_exists("Idħol", $params)) {
tarmi ġdid Eċċezzjoni("Ebda login mogħtija");
}
$login = &$params["Idħol"];
$em = $ dan-> kontenitur-> tikseb (“doctrine.orm.default_entity_manager”);
$user = $em->getRepository(“NamespaceMyBundle:Utent”)->findOneBy(firxa("Idħol" => $login));
if ($utent == null) {
ritorn $ dan-> indirizz mill-ġdid ($ dan->generateUrl("Idħol", firxa()));
}
$password = “myRandowPassword”;
$user->setPassword($ dan-> kontenitur-> tikseb (“security.encoder_factory”)->getEncoder($user)->encodePassword($password, $user->getSalt()));
$em->persist($user);
$em-> flush();
// Nibagħtu l-password bl-email
ritorn $ dan-> indirizz mill-ġdid ($ dan->generateUrl("Idħol", firxa()));
}

Dan il-metodu kien iddisinjat biex reset il-password ta' utent li pprovda tiegħu login/username. Fil-każ tiegħi, il-password imbagħad intbagħtet bl-email. Ħa nħallik iżżid dik il-linja galanti.

  1. Allura aħna sejrin tfittxija utent.
  2. Aħna niġġeneraw password li aħna naslu biex ninfurmaw fl-utent ladarba huwa jkun kodifikat skond ir-regoli li inti tkun iddefinit.

Issettja l-bidla fil-password

F'dan il-punt, l-utent tagħna jista 'jiġġenera password ġdida jekk intilfet, iżda f'każ li jrid biss jibdelha, għandna bżonn gate biex tiddefinixxi gate.

1
2
3
4
5
6
7
8
9
/ **
* @Metodu({“GET”})
* @Triq(“/ bidla”, isem = ” bidla-password”)
* @Sikura(rwoli=”IS_AUTHENTICATED_FULLY”)
* @Mudell()
*/
pubblika funzjoni bidla() {
ritorn firxa();
}

Hawn hu l-kodiċi biex tiġġenera l-veduta. L-ewwel, ser ikollok ddaħħal il-password l-antika tiegħek, imbagħad daħħal il-password il-ġdida darbtejn. It-tieni darba tkun konferma.

Issa se naraw il-kodiċi biex resetter il-password. IL proċess huwa simili għall-ġenerazzjoni ta 'password każwali ġdida.

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
/ **
 * @Metodu({“POST”})
 * @Triq(“/bidla”)
 * @Sikura(rwoli=”IS_AUTHENTICATED_FULLY”)
 * @Mudell()
 */
pubblika funzjoni ibdelIssa(Talba $ talba)
{
    $params = $talba->talba->kollha();
    if (!array_key_exists("kurrent", $params)
        || !array_key_exists("ġdid", $params)
        || !array_key_exists(“ġdid2”, $params))
    {
        ritorn firxa("żball" => “Jekk jogħġbok imla l-oqsma kollha”);
    }
    $em = $ dan-> kontenitur-> tikseb (“doctrine.orm.default_entity_manager”);
    $utent = $ dan->getUser();
    $user_encoders = $ dan-> kontenitur-> tikseb (“security.encoder_factory”)->getEncoder($user);
    $user_repository = $em->getRepository(“NamespaceMyBundle:Utent”);
    $current_password_encoded = $user_encoders->encodePassword($params["kurrent"], $user->getSalt());
    $new_password_encoded = $user_encoders->encodePassword($params["ġdid"], $user->getSalt());
    if ($user_repository->findOneBy(firxa(“password” => $current_password_encoded)) == null) {
        ritorn firxa("żball" => "Il-password attwali hija ħażina");
    } elseif ($params["ġdid"] != $params[“ġdid2”]) {
        ritorn firxa("żball" => "Iż-żewġ oqsma password mhumiex l-istess");
    }
    $user->setPassword($new_password_encoded);
    $em->persist($user);
    $em-> flush();
    ritorn $ dan-> indirizz mill-ġdid ($ dan->generateUrl("Oħroġ", firxa()));
}

Jekk tieħu minuta biex taqra l-kodiċi, tara li dan huwa partikolarment sempliċi.

  1. L-ewwel, niċċekkjaw jekk it-tliet oqsma (password l-antika, password ġdida u konferma) ddaħħlux b'mod korrett.
  2. On daħħal il-password kurrenti u aħna nqabbluha mal-password attwaliment fid-database biex tara jekk tikkorrispondix mal-password l-antika mdaħħla.
  3. Aħna niċċekkjaw jekk iż-"żewġ" passwords ġodda humiex identiċi.
  4. Daħħal il-password il-ġdida u timbotta fl-entità.

Attivazzjoni tal-kont tiegħu

Din il-karatteristika mhix dettaljata perfettament f'oħrajn siltiet hawn fuq. L-iskop tiegħu huwa li jiżblokka utent li jkun għadu kemm irreġistra, meta jkun ivvalida l-email tiegħu pereżempju. Din il-funzjonalità hija żviluppata fuq kważi l-pjattaformi kollha li nafu għal diversi raġunijiet. Biex twaqqaf imblukkar ta' utent, jista' jkollok bżonn ukoll li timplimenta fornitur.

  • Blokk/limit kontijiet foloz u ispam.
  • Verifikatur li l-utent ikun imla indirizz elettroniku li jidher li jista’ jintuża mal-ewwel daqqa t’għajn.
  • neħħi kontijiet li ma ġewx validati wara ċertu perjodu ta’ żmien.

Workflow

  1. Utent jirreġistra. Il-kont tiegħu mbagħad jiġi mblukkat permezz ta' qasam speċifiku għalik. Dan il-qasam għandu mbagħad jipprevjenih milli jgħaqqad sakemm dan il-qasam jindika li l-kont huwa diżattivat.
1
2
3
4
5
6
7
8
// NamespaceMyBundleEntityUser
klassi utent {
pubblika funzjoni __bini() {
$ dan->token = hash(“sha512”, uniqid());
}
...
}
1
$user->setEnabled(falza);
  1. L-utent irċieva email meta l-profil tiegħu kien flush fid-database. Din l-email trid tkun parti minn indirizz li tiġġenera.
    F’din it-triq, a token jew identifikatur uniku għandu jingħata li jippermetti li jinstab l-utent ikkonċernat. Nagħtik parir biex tuża UUID4 li huwa maħsub li jkun każwali. Tista' ssib il-lista tal-UUIDs kif ukoll id-deskrizzjoni tal-verżjonijiet kollha.
1
2
3
4
/ **
* @Triq(“/attiva”, isem="attiva")
*/
pubblika funzjoni jattiva() {...}
1
$ dan->generateUrl("attiva", firxa(« token » => $user->getToken()), veru);

Għandu jkollok URL bħal dan.

1
http://hostname/attiva?token=myUniqueToken
  1. L-utent jiftaħ l-email tiegħu u jipprova jattiva l-kont tiegħu billi jikklikkja fuq il-link ipprovdut. Imbagħad nidħlu fil-proċess hawn taħt.
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
/ **
 * @Metodu({“GET”})
 * @Triq(“/attiva”, isem="attiva")
 * @Sikura(rwoli=”IS_AUTHENTICATED_ANONYMOUSLY”)
 * @Mudell()
 */
pubblika funzjoni jattiva(Talba $ talba) {
    $params = firxa();
    $token = $talba->query->get(« token »);
    $em = $ dan-> kontenitur-> tikseb (“doctrine.orm.default_entity_manager”);
$user = $em->getRepository(“NamespaceMyBundle:Utent”)->findOneBy(firxa(« token » => $token));
    if ($utent != null) {
        $user->setEnabled(veru);
        $em->persist($user);
        $em-> flush();
        $params["attiva"] = veru;
    } inkella {
        $params["attiva"] = falza;
    }
    ritorn $params;
}

B'dan il-proċess għandu jkollok l-ebda problema biex tippermetti l-validazzjoni tal-kont tal-utent fis-seħħ.

Tista' ssib dan il-kodiċi ekwivalenti fuq dan il-Gist.

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
użu JMSSecurityExtraBundleAnnotazzjoniSecure;
użu SensioBundleFrameworkExtraBundleKonfigurazzjoniMetodu;
użu SensioBundleFrameworkExtraBundleKonfigurazzjoniRotta;
użu SensioBundleFrameworkExtraBundleKonfigurazzjoniTemplate;
użu SymfonyBundleFrameworkBundleKontrollurKontrollur;
użu SymfonyKomponentFondazzjoni HttpTalba;
użu SymfonyKomponentSigurtàCoreKuntest tas-Sigurtà;
klassi Kontrollur tas-Sigurtà testendi Kontrollur
{
/ **
* @Metodu({“GET”})
* @Triq(“/login”, isem="login")
* @Mudell()
*/
pubblika funzjoni login(Talba $ talba)
{
$talba = $ dan->getRequest();
$sessjoni = $talba->getSession ();
if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
$żball = $talba->attributi->get(SecurityContext::AUTHENTICATION_ERROR);
} inkella {
$żball = $sessjoni->get(SecurityContext::AUTHENTICATION_ERROR);
$sessjoni->neħħi(SecurityContext::AUTHENTICATION_ERROR);
}
$params = firxa(
“last_username” => $sessjoni->get(SecurityContext::LAST_USERNAME),
"żball" => $żball,
"messaġġ" => $ talba-> tikseb ("messaġġ"),
);
if ($talba->isXmlHttpRequest()) {
ritorn $ dan-> jirrendi(“GCDirectoryMainBundle:Security:login-ajax.html.twig”, $params);
}
ritorn $params;
}
/ **
* @Metodu({“POST”})
* @Triq(“/login_check”, name="login_check")
*/
pubblika funzjoni check()
{
tarmi ġdid RuntimeException("Int trid tikkonfigura l-passaġġ tal-kontroll li għandu jiġi mmaniġġjat mill-firewall billi tuża form_login fil-konfigurazzjoni tal-firewall tas-sigurtà tiegħek.");
}
/ **
* @Metodu({“GET”})
* @Triq(“/logout”, name="logout")
*/
pubblika funzjoni logout()
{
tarmi ġdid RuntimeException('Int trid tattiva l-logout fil-konfigurazzjoni tal-firewall tas-sigurtà tiegħek.');
}
/ **
* @Metodu({“GET”})
* @Triq(“/reset”, isem =”reset”)
* @Sikura(rwoli=”IS_AUTHENTICATED_ANONYMOUSLY”)
* @Mudell()
*/
pubblika funzjoni reset() {
ritorn firxa();
}
/ **
* @Metodu({“POST”})
* @Triq(“/reset”)
* @Sikura(rwoli=”IS_AUTHENTICATED_ANONYMOUSLY”)
*/
pubblika funzjoni reset Issa(Talba $ talba)
{
$params = $talba->talba->kollha();
if (!array_key_exists("Idħol", $params)) {
tarmi ġdid Eċċezzjoni("Ebda login mogħtija");
}
$login = &$params["Idħol"];
$em = $ dan-> kontenitur-> tikseb (“doctrine.orm.default_entity_manager”);
$user = $em->getRepository(“NamespaceMyBundle:Utent”)->findOneBy(firxa("Idħol" => $login));
if ($utent == null) {
ritorn $ dan-> indirizz mill-ġdid ($ dan->generateUrl("Idħol", firxa()));
}
$password = “myRandowPassword”;
$user->setPassword($ dan-> kontenitur-> tikseb (“security.encoder_factory”)->getEncoder($user)->encodePassword($password, $user->getSalt()));
$em->persist($user);
$em-> flush();
ritorn $ dan-> indirizz mill-ġdid ($ dan->generateUrl("Idħol", firxa()));
}
/ **
* @Metodu({“GET”})
* @Triq(“/ bidla”, isem = ” bidla-password”)
* @Sikura(rwoli=”IS_AUTHENTICATED_FULLY”)
* @Mudell()
*/
pubblika funzjoni bidla() {
ritorn firxa();
}
/ **
* @Metodu({“POST”})
* @Triq(“/bidla”)
* @Sikura(rwoli=”IS_AUTHENTICATED_FULLY”)
* @Mudell()
*/
pubblika funzjoni ibdelIssa(Talba $ talba)
{
$params = $talba->talba->kollha();
if (!array_key_exists("kurrent", $params)
|| !array_key_exists("ġdid", $params)
|| !array_key_exists(“ġdid2”, $params))
{
ritorn firxa("żball" => “Jekk jogħġbok imla l-oqsma kollha”);
}
$em = $ dan-> kontenitur-> tikseb (“doctrine.orm.default_entity_manager”);
$utent = $ dan->getUser();
$user_encoders = $ dan-> kontenitur-> tikseb (“security.encoder_factory”)->getEncoder($user);
$user_repository = $em->getRepository(“NamespaceMyBundle:Utent”);
$current_password_encoded = $user_encoders->encodePassword($params["kurrent"], $user->getSalt());
$new_password_encoded = $user_encoders->encodePassword($params["ġdid"], $user->getSalt());
if ($user_repository->findOneBy(firxa(“password” => $current_password_encoded)) == null) {
ritorn firxa("żball" => "Il-password attwali hija ħażina");
} elseif ($params["ġdid"] != $params[“ġdid2”]) {
ritorn firxa("żball" => "Iż-żewġ oqsma password mhumiex l-istess");
}
$user->setPassword($new_password_encoded);
$em->persist($user);
$em-> flush();
ritorn $ dan-> indirizz mill-ġdid ($ dan->generateUrl("Oħroġ", firxa()));
}
/ **
* @Metodu({“GET”})
* @Triq(“/reġistru”, isem="reġistru")
* @Sikura(rwoli=”IS_AUTHENTICATED_ANONYMOUSLY”)
* @Mudell()
*/
pubblika funzjoni reġistru()
{
$forma = $ dan->createForm(ġdid UserType(UserType::REGISTER), ġdid Utent());
ritorn firxa(
"forma" => $form->createView (),
);
}
/ **
* @Metodu({“POST”})
* @Triq(“/reġistru”)
* @Sikura(rwoli=”IS_AUTHENTICATED_ANONYMOUSLY”)
* @Mudell()
*/
pubblika funzjoni Irreġistra issa(Talba $ talba)
{
$params = $talba->talba->kollha()[“isem_tal-forma_tiegħi”];
$forma = $ dan->createForm(ġdid UserType(UserType::REGISTER), ġdid Utent());
$form->submit($talba);
if (array_key_exists(“plain_password”, $params) && array_key_exists(“plain_password2”, $params) && $params[“plain_password”] == $params[“plain_password2”]) {
if ($form->isValid()) {
$data = $form->getData ();
$data->setPassword($ dan-> kontenitur-> tikseb (“security.encoder_factory”)->getEncoder($data)->encodePassword($params[“plain_password”], $data->getSalt()));
$em->persistu($data);
$em-> flush();
ritorn $ dan-> indirizz mill-ġdid ($ dan->generateUrl("Idħol", firxa("messaġġ" => “Int irċevejt email biex tivvalida l-kont tiegħek. »)));
}
}
ritorn firxa(
"żbalji" => $params[“plain_password”] == $params[“plain_password2”]? $form->getErrors(): firxa("Iż-żewġ passwords għandhom ikunu l-istess"),
"forma" => $form->createView (),
);
}
/ **
* @Metodu({“GET”})
* @Triq(“/attiva”, isem="attiva")
* @Sikura(rwoli=”IS_AUTHENTICATED_ANONYMOUSLY”)
* @Mudell()
*/
pubblika funzjoni jattiva(Talba $ talba) {
$params = firxa();
$token = $talba->query->get(« token »);
$em = $ dan-> kontenitur-> tikseb (“doctrine.orm.default_entity_manager”);
$user = $em->getRepository(“NamespaceMyBundle:Utent”)->findOneBy(firxa(« token » => $token));
if ($utent != null) {
$user->setActive(Utent::ACTIVE_ACTIVE);
$em->persist($user);
$em-> flush();
$params["attiva"] = veru;
} inkella {
$params["attiva"] = falza;
}
ritorn $params;
}
}

★ ★ ★ ★ ★