рд╕рд┐рдореНрдлрдиреА 2.0 рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЧреИрд░-рдорд╛рдирдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг

рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕рд┐рдореНрдлрдиреА 2.0 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдорд╛рдирдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рд╣реИред

рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ?


рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ ORM рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдпрд╛ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдХрд╛рд░реНрдп


рдореЗрд░реЗ рд▓рд┐рдП, рдХрд╛рд░реНрдп рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛: рдореЗрд░реЗ рдкрд╛рд╕ рд╕рд┐рдореНрдлрдиреА 1.4 рдкрд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдереА рдФрд░ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде, "рдореЗрд░реЗ рд╣рд╛рдереЛрдВ рдХреЛ рдЦрд░реЛрдВрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛", рд╕рд┐рд╕реНрдЯрдо рдХреА рдиреАрдВрд╡ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ 2.0 рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЙрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрддред

рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдбреЗрдЯрд╛ MongoDB рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкрд╣реБрдВрдЪ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд░рд▓ рдЖрд╡рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдереА, рдЬреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдмрд╛рдБрдз рд╕рдХрддреА рдереАред рд╕рд┐рдореНрдлрдиреА 2 рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдХреЛ рдмрд╛рдВрдзрдирд╛ рдЖрд╕рд╛рди рдерд╛ред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рд░реНрдп рдХреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ MongoDB рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕реБрдзрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдЦрд╛рддреЛрдВ рдкрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рд╣реИред

рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рд╕рд┐рдореНрдлрдиреА 2.0 рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдлреНрд░реЗрдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдШрдЯрдХред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЬреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рдерд╛, рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдШрдЯрдирд╛рдУрдВ рдпрд╛ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╢реНрд░реЛрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рджреМрд░рд╛рди, рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ (рдЙрд░реНрдл рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛), рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд▓реМрдЯрд╛рдИ рдЧрдИред

рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрддрд╛ рд╣реИ:
  1. рдХрд░реНрдиреЗрд▓ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ;
  2. рдЕрдиреБрд░реЛрдз рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  3. рдЕрдиреБрд░реЛрдз "рд░рд╛рдЙрдЯрд░" рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреБрд░реЛрдзрд┐рдд рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  4. рдХрд╛рд░реНрд░рд╡рд╛рдИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддреИрдпрд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ;
  5. рдЙрддреНрдкрдиреНрди рдЙрддреНрддрд░ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╛рд╕реНрддреЗ рдХрд╛ рдЕрдкрдирд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдирд╡реАрдирддрдо рд╕рдорд╛рдпреЛрдЬрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд╣рдо рдЪрд░рдг 2 рдФрд░, рднрд╛рдЧ 3 рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдЧреАрдд рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
  1. рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд░рдХреНрд╖рд╛ рд╢реНрд░реЛрддрд╛ рдЕрдиреБрд░реЛрдз рдШрдЯрдирд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ "рдмрдЪреНрдЪреЗ" рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
  2. рд╢реНрд░реЛрддрд╛ рдПрдХ рдЯреЛрдХрди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ;
  3. AuthenticationManager рдЙрдкрдпреБрдХреНрдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рдЯреЛрдХрди рджреЗрддрд╛ рд╣реИред
  4. рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рджрд╛рддрд╛ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдкрд╛рд╕ рд▓реМрдЯрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╢реНрд░реЛрддрд╛, рдмрджрд▓реЗ рдореЗрдВ, рдЕрдзрд┐рдХреГрдд (рдпрд╛ рдЕрдзрд┐рдХреГрдд рдирд╣реАрдВ) рдЯреЛрдХрди рд╣реИред рдЗрд╕ рд╕реНрддрд░ рдкрд░, UserProvider рд╕рдХреНрд░рд┐рдп рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  5. рд╢реНрд░реЛрддрд╛, рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдмрдВрдзрдХ рдФрд░ рдЙрд╕рдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рддреЛ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреАрдХреЙрдирдЯреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХреГрдд рдЯреЛрдХрди "рдкрд╛рдо рдСрдл" рдпрд╛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛) рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рджреЛрдиреЛрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╢реНрд░реЛрддрд╛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдиреБрд░реЛрдз рдИрд╡реЗрдВрдЯ "рд░рд╛рдЙрдЯрд░" рдХреЛ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдХреЛрдИ рдХреЙрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
  6. рддрдм рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╣реЛрддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдХрджрдореЛрдВ рдХреЛ рдирд╣реАрдВ рдмрдирд╛рдпрд╛, рд▓реЗрдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрдд рдПрдХ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВред

1.x рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЬрд╣рд╛рдВ рд╕рднреА рд╡рд░реНрдгрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╕реАрдзреЗ рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╣реБрдИрдВ, рдпрд╣ рдпреЛрдЬрдирд╛ рдЕрддрд┐рднрд╛рд░рд┐рдд, рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд▓рдЧрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рднрд╛рдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рд╢реЗрд╖ рдХрд╛рд░реНрдп рдХреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд╕реМрдВрдк рджреЗрддрд╛ рд╣реИред

рдЪрд░рдг реж - рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВред


рдЬреЛ рдХреБрдЫ рднреА рдЖрдк рд╕рд┐рдореНрдлрдиреА 2.0 рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рд╡реНрдпрд╡рд╕рд╛рдп рд╕реЗ рдиреАрдЪреЗ рдЙрддрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдмрдВрдзрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЛ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рд╕реЗрд╡рд╛ рдХрдВрдЯреЗрдирд░ рдкреБрд╕реНрддрдХ рдХреЗ рдЕрдзреНрдпрд╛рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рднрд╛рд╖рд╛ рдореЗрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк "рдЕрдЬреАрдм" рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдЧреЗ рдкрдврд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдбреЙрдХреНрдЯреНрд░рд┐рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реВрдЪреАрдмрджреНрдз рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИред

рдЪрд░рдг 1 - рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдзрд╛рд░ред


рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд╕рд┐рдореНрдлрдиреА 2.0 рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЙрдкрдХрд░рдг рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╕реЗрдЯ рд╣реИред рд▓реЙрдЧрд┐рди / рдкрд╛рд╕рд╡рд░реНрдб рдЬреЛрдбрд╝реА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рджреЗрд╢реА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рджреЛрдиреЛрдВ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рджреНрд╡рд╛рд░рд╛ рд╕рдмрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ MongoDB рдкрд░ рдФрд░ рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рд▓реЗрдВред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ UserInterface рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

namespace MyBundle\Models; use Mh\Mongo\Model\Base; use Symfony\Component\Security\Core\User\AdvancedUserInterface; use Symfony\Component\Security\Core\User\UserInterface; class User extends Base implements UserInterface { public function getRoles() { return $this->credentials; } public function getPassword() { return $this->passw; } public function getSalt() { return $this->salt; } public function getUsername() { return $this->uname; } public function eraseCredentials() { } public function equals(UserInterface $user) { return $this->getUsername() === $user->getUsername(); } public function __toString() { return $this->uname; } } 


рд╡рд░реНрдЧ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ MongoDB рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдореВрд▓ рд╡рд░реНрдЧ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИред UserInterface рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдпрд╣ getRoles рд╡рд┐рдзрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЙрдкрд░реЛрдХреНрдд рд▓реЗрдЦ рдореЗрдВ рдпрд╣ рд╡рд┐рдзрд┐ рднреВрдорд┐рдХрд╛ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд▓реМрдЯрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╕рд░рд▓ рддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рд╣реИ, рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдпрджрд┐ рд╣рдо рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рдЙрди рд╕рдореВрд╣реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рдореВрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд░реЛрд▓рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рднреВрдорд┐рдХрд╛рдПрдВ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред

рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ UserProviderInterface рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрдХреНрд╖рд╛ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

 namespace MyBundle\Security; use Mh\Mongo\MongoBundle\ConnectionManager; use MyBundle\Models\User; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\UserProviderInterface; use \Exception; use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; class UserProvider implements UserProviderInterface { protected $collection; protected $db; protected $field; protected $logger; //  ,  ,      //  ,          // . public function __construct(array $params, ConnectionManager $cm, LoggerInterface $logger) { //         $this->db = $cm->getConnection($params['confname']); $this->collection = $this->db->selectCollection($params['collection']); //       ,   $this->field = $params['field']; if (!$this->field || !$this->collection) { throw new Exception("Invalid parameters"); } //     logger',   DI $this->logger = $logger; } //        , //    . public function loadUserByUsername($uname) { //      . $this->logger->debug("user load request. name: $uname"); //         User //   . $user = $this->collection->findOne(array($this->field => $uname)); //  . ,    . if (!isset($user->uname) || $user->uname !== $uname) { throw new UsernameNotFoundException(sprintf('User "%s" does not exist.', $uname)); } //     return $user; } //       . //        . public function refreshUser(UserInterface $user) { if (!($user instanceof User)) throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user))); $this->logger->info("refresh from mongo"); $_user = $this->collection->findOne(array('_id' => $user->_id)); if ($_user && $_user instanceof User) $this->logger->info("roles: " .implode(', ',$_user->roles)); else throw new UsernameNotFoundException(sprintf('User "%s" does not exist.', $user->uname)); return $_user; } //    . public function supportsClass($class) { $this->logger->debug("support checking: $class"); if ($class == 'MyBundle\Models\User') return true; return false; } } 


рдЕрдм рдЖрдкрдХреЛ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдШрдЯрдХ рдХреЛ "рд╕рд┐рдЦрд╛рдирд╛" рдЪрд╛рд╣рд┐рдПред

рд╣рдорд╛рд░реЗ рдмрдВрдбрд▓ рдХреА рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВред рд╕реЗрд╡рд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝реЗрдВ:

 рдкреИрд░рд╛рдореАрдЯрд░:
   my.users:
     confname: рдбрд┐рдлрд╝реЙрд▓реНрдЯ
     рд╕рдВрдЧреНрд░рд╣: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
     рдлрд╝реАрд▓реНрдб: рдЕрдирд╛рдо

 рд╕реЗрд╡рд╛рдПрдВ:
   my.users.prov:
     рд╡рд░реНрдЧ: MyBundle \ Security \ UserProvider
     рддрд░реНрдХ: [% my.users%, @ mongo.manager, @ monolog.logger]


Security.yml рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╣рдо рд▓рд┐рдЦреЗрдВрдЧреЗ:

 рд╕реБрд░рдХреНрд╖рд╛:
     рдПрдирдХреЛрдбрд░:
         рд╕рд┐рдореНрдлрдиреА \ рдШрдЯрдХ \ рд╕реБрд░рдХреНрд╖рд╛ \ рдХреЛрд░ \ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ \ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛: рд╕рд╛рджрд╛
         # рд▓реЙрдиреНрдЪ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдЕрдирдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдкрд╛рд╕рд╡рд░реНрдб рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ		
         MyBundle \ рдореЙрдбрд▓ \ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛: plaintext

     рдкреНрд░рджрд╛рддрд╛рдУрдВ:
	 # рдЕрдм рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрд░реЛрдд рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ (рдХреЛрдИ рднреА рдирд╛рдо рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
	 # рдФрд░ рдЙрд╕рдореЗрдВ рдЙрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдирд╛рдо рд▓рд┐рдЦреЗрдВ рдЬреЛ рдбреЗрдЯрд╛ рджреЗрдЧреА 
         # рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
         mongobase:
           рдЖрдИрдбреА: my.userprov
 ...


рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣реАрдВ рднреА рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╛ рдореИрдВрдиреЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛)ред рдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ, рдпрджрд┐ рджреВрд╕рд░рд╛ рдкреНрд░рджрд╛рддрд╛ рд╕реАрдзреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд╣рд▓рд╛ред

рджрд░рдЕрд╕рд▓ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА MongoDB рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдЧрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдбреЗрдЯрд╛ рд╣реИред рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЙрдкрд░реЛрдХреНрдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдЪрд░рдг 2 - OAuth рдкреНрд░рдорд╛рдгреАрдХрд░рдг


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рдирд╡рд╛рдЪрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЦрд╛рддреЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдиреЗрдЯрд╡рд░реНрдХред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рд╕рднреА "рдкреНрдпрд╛рд░реЗ" рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред VKontakte рдиреЗрдЯрд╡рд░реНрдХред

рд╕рд┐рдореНрдлрдиреА 2.0 рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╡рд┐рдзрд┐ рдмрдирд╛рдирд╛ рдкреНрд░рд▓реЗрдЦрд┐рдд рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред WSSE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд▓реЗрдЦ рд╣реИ ред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░, рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ред рд╕рд╛рдорд╛рдЬрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддред рдореБрдЭреЗ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдПрдХ рд╣рдм рдкрд░ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдорд┐рд▓рд╛

рдЕрдм рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдереЛрдбрд╝рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгрд┐рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рднреА рдореЗрд░реА рдЬрд╝рд░реВрд░рдд рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред VKontakte рдЦрд╛рддреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп (рд▓реЙрдЧрд┐рди / рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реЙрдЧрд┐рди рдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕рд┐рдореНрдлрдиреА рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдлреЙрд░реНрдо (form_login) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдмрд┐рд▓реНрдЯ-рдЗрди AuthenticationListeners рдФрд░ AuthenticationProviders рдХреЛ рдЙрди рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рд╕рд┐рдореНрдлрдиреА рдореЗрдВ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛рд░реНрдп рд╕реЗ рдЬреБрдбрд╝реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд░реВрдЯреАрди рдХрд╛рд░реНрдп рд▓реЗрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЖрджрд┐ред рд╣рдо рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ред

рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд▓реЗрдЦ рдХреА рддрд░рд╣, рдЖрдЗрдП рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ:

 namespace MyBundle\Social\Authentication; use Symfony\Component\Security\Core\Authentication\Token\AbstractToken; class Token extends AbstractToken { //      . public $social; public $hash; public $add; //   ,    function __construct(array $roles = array()) { parent::__construct($roles); //    ,    //          . parent::setAuthenticated(count($roles) > 0); } // ,    TokenInterface public function getCredentials() { } //         , //      .     тАЬтАЭ //     . public function serialize() { $pser = parent::serialize(); return serialize(array($this->social, $this->hash, $this->add, $pser)); } public function unserialize($serialized) { list($this->social, $this->hash, $this->add, $pser) = unserialize($serialized); parent::unserialize($pser); } } 


рдЯреЛрдХрди рд╡рд░реНрдЧ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдПрдХ рд╢реНрд░реЛрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╡рд░реНрдгрд┐рдд рдХрдХреНрд╖рд╛ рдХреЗ рдЯреЛрдХрди рдмрдирд╛рдПрдЧрд╛ред

 namespace MyBundle\Social\Authentication; //       AbstractAuthenticationListener, //     тАЬтАЭ   , //       use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\Security\Http\Firewall\ListenerInterface; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Core\SecurityContextInterface; use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Http\Session\SessionAuthenticationStrategyInterface; use Symfony\Component\Security\Http\HttpUtils; use Symfony\Component\HttpKernel\Log\LoggerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface; class AuthenticationListener extends AbstractAuthenticationListener { //      тАЬтАЭ  .  protected $social; //    ,  //   public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $providerKey, array $options = array(), AuthenticationSuccessHandlerInterface $successHandler = null, AuthenticationFailureHandlerInterface $failureHandler = null, LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null, array $social = array()) { parent::__construct($securityContext, $authenticationManager, $sessionStrategy, $httpUtils, $providerKey, array_merge(array( 'intention' => 'authenticate', ), $options), $successHandler, $failureHandler, $logger, $dispatcher); $this->social = $social; } //  attemptAuthentication   ,   //    ,    Token' public function attemptAuthentication(Request $request) { //      ,     //     if ($request->get('uid') && $request->get('hash') && $request->cookies->get("vk_app_{$this->social['vk']['id']}")) { $this->logger->debug("vk auth handled"); //     $uid = $request->get('uid'); $fn = $request->get('first_name'); $ln = $request->get('last_name'); $hash = $request->get('hash'); $this->logger->info("user $fn $ln [$uid] // $hash"); $avatars = array( 'sav' => $request->get('photo'), 'srav' => $request->get('photo_rec'), ); //   token     //   .  тАж $token = new Token(); $token->setUser("vk{$uid}"); // тАж     token' ... $token->social = 'vk'; $token->hash = $hash; $token->add = array( 'uid' => $uid, 'avatar' => $avatars, 'name' => "$fn $ln", ); // тАж     ,     return $this->authenticationManager->authenticate($token); } //        -   . } } 


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╢реНрд░реЛрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдЕрдиреБрд░реЛрдз рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рд╣реИред AbstractAuthenticationListener рд╣рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, URI рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдкреНрд░рдмрдВрдзрди рдФрд░ рдЕрдиреНрдп рд░реВрдЯреАрди рдЬреЛ рдХрд┐ AuthenticationListener рдХреА "рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ" рдХрд╛ рднреА рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред

рд╢реНрд░реЛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рдСрдереЗрдВрдЯрд┐рдХреЗрд╢рдирдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬреЛ рд╕реАрдзреЗ рдЯреЛрдХрди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдлрд▓ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдЧрд╛ред

 namespace MyBundle\Social\Authentication; use Mh\Mongo\MongoBundle\ConnectionManager; use MyBundle\Models\User as User; use Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface; use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Core\Exception\NonceExpiredException; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; use Symfony\Component\HttpKernel\Log\LoggerInterface; //    AuthenticationProvider'     // ,     UserAuthenticationProvider, //            . class Provider implements AuthenticationProviderInterface { protected $userProvider; protected $logger; //     .  protected $social; //       MongoDB  //    protected $mongo; //   ,     //  . public function __construct(UserProviderInterface $userProvider, array $social, ConnectionManager $cm, LoggerInterface $logger) { $this->userProvider = $userProvider; $this->social = $social; $this->mongo = $cm; $this->logger = $logger; } //    public function authenticate(TokenInterface $token) { $user = null; //      UserProvider'a //      ,      try { $user = $this->userProvider->loadUserByUsername($token->getUsername()); } catch (UsernameNotFoundException $ex) { $this->logger->debug("user ".$token->getUsername()." not yet registred"); } try { //    hash' if ($this->checkHash($token)) { $this->logger->info("hash is valid"); //  ,    hash,   //    -  тАЬтАЭ if (!$user) { $this->logger->info("register new user"); $user = new User(array( 'uname' => $token->getUsername(), 'social' => $token->social, 'fullname' => $token->add['name'], 'avatar' => $token->add['avatar'], 'suid' => $token->add['uid'], 'roles' => array('ROLE_EXTUSER', strtoupper($token->social) ), )); $user->save($this->mongo); } //    . ,   Token //      $authenticatedToken = new Token($user->getRoles()); $authenticatedToken->social = $token->social; $authenticatedToken->hash = $token->hash; $authenticatedToken->add = $token->add; $authenticatedToken->setUser($user); //        return $authenticatedToken; } else { $this->logger->debug("hash is invalid."); } } catch (\Exception $ex) { $this->logger->err("auth internal exception: $ex"); } //   -     -  //  . throw new AuthenticationException('The Social authentication failed.'); } //   hesh',      //  . protected function checkHash(Token $token) { if ($token->social == 'vk') { return ($token->hash === md5( $this->social['vk']['id'] . $token->add['uid'] . $this->social['vk']['key'] )); } return false; } //  ,    token'  provider' public function supports(TokenInterface $token) { return $token instanceof Token; } } 


AuthenticationProvider рдкрд░ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЧрдИ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рд╕рд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред UserProvider рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдХрд╛рдо рдХрд╛ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ "рдкрд╛рд░рджрд░реНрд╢реА" рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рдореНрдлрдиреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЛ SecurityFactoryInterface рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рддреЛ рдЪрд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

 namespace MyBundle\DependencyInjection\Security; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\DefinitionDecorator; use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface; //   Symfony   AbstractFactory     . //    ,      ,   //    AuthenticationProvider' class SocialAuthFactory implements SecurityFactoryInterface { //      firewall'    //  .     form_login. protected $options = array( 'check_path' => '/login_check', 'login_path' => '/login', 'use_forward' => false, 'always_use_default_target_path' => false, 'default_target_path' => '/', 'target_path_parameter' => '_target_path', 'use_referer' => false, 'failure_path' => null, 'failure_forward' => false, ); //  ,       firewall  listener  // provider. //      , id firewall'  // ,       . public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint) { //      ,     //   . //      тАЬтАЭ   // (  )    . //  id    AuthenticationProvider' $providerId = 'security.authentication.provider.social.'.$id; //    -    my.socialauth.prov //  (0)         //   $container ->setDefinition($providerId, new DefinitionDecorator('my.socialauth.prov')) ->replaceArgument(0, new Reference($userProvider)) ; //  listener'    ,    provider' $listenerId = 'security.authentication.listener.social.'.$id; $container ->setDefinition($listenerId, new DefinitionDecorator('my.socialauth.listener')) ->replaceArgument(4, $id) ->replaceArgument(5, array_intersect_key($config, $this->options)); //   id  . return array($providerId, $listenerId, $defaultEntryPoint); } //  ,       //   .      login_form. public function getPosition() { return 'form'; } //      ,      //     . public function getKey() { return 'mysocial'; } //   ,      // AbstractFactory public function addConfiguration(NodeDefinition $node) { $builder = $node->children(); $builder ->scalarNode('provider')->end() ; foreach ($this->options as $name => $default) { if (is_bool($default)) { $builder->booleanNode($name)->defaultValue($default); } else { $builder->scalarNode($name)->defaultValue($default); } } } } 


рдлреИрдХреНрдЯреНрд░реА рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЗрд╡рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреВрд░рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред

рдЪрд▓реЛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣рд╛рдБ рдЖрдк рдЕрдкрдиреЗ niches рдХреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ ...

  рд╕реБрд░рдХреНрд╖рд╛:

     рдХрд╛рд░рдЦрд╛рдиреЛрдВ:
         - "% kernel.root_dir% / .. / src / MyBundle / Resources / config / socialauth_factory.yml"
 ... 


... рдЖрдЧреЗ, рд╣рдо рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рднрд░реЗрдВ рдЬрд┐рд╕реЗ рд╣рдо рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп services.yml рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИред

 рд╕реЗрд╡рд╛рдПрдВ:
     security.authentication.factory.mysocial:
         рд╡рд░реНрдЧ: MyBundle \ DependencyInjection \ Security \ Factory \ SocialFactory
         рдЯреИрдЧ:
             - {рдирд╛рдо: рд╕реБрд░рдХреНрд╖рд╛ред


рдЕрдм рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде services.yml рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

  рдкреИрд░рд╛рдореАрдЯрд░:
   my.users:
     confname: рдбрд┐рдлрд╝реЙрд▓реНрдЯ
     рд╕рдВрдЧреНрд░рд╣: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
     рдлрд╝реАрд▓реНрдб: рдЕрдирд╛рдо

   my.social:
     рдЖрдИрдбреА: __YOUR_APP_ID__
     рдХреБрдВрдЬреА: __YOUR_APP_PRIVATE_KEY__

 рд╕реЗрд╡рд╛рдПрдВ:
   my.users.prov:
     рд╡рд░реНрдЧ: MyBundle \ Security \ UserProvider
     рддрд░реНрдХ: [% my.users%, @ mongo.manager, @ monolog.logger]

   # рд╣рдо рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯрд▓рд┐рд╕реНрдЯ рд╕рд░реНрд╡рд┐рд╕ рдХреЗ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд╢реНрд░реЛрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ
   # рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рддрд░реНрдХ рддрд░реНрдХреЛрдВ рдХреЗ рдмрд╛рдж рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗ,   
   # рдореВрд▓ рд╕реЗрд╡рд╛ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд
   my.socialauth.listener:
     рд╡рд░реНрдЧ: MyBundle \ Social \ Authentication \ Listener
     рдЬрдирдХ: рд╕реБрд░рдХреНрд╖рд╛
     рддрд░реНрдХ: [% my.social%]
    
   # рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдореЗрдВ, рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдХреЗ рдмрд┐рдирд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
   # рдлреИрдХреНрдЯреНрд░реА рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗ рдореВрд▓реНрдп рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
   my.socialauth.prov:  
     рд╡рд░реНрдЧ: MyBundle \ Social \ Authentication \ рдкреНрд░рджрд╛рддрд╛
     рддрд░реНрдХ: ['',% my.social%, @ mongo.manager, @ monolog.logger]


рдЖрдЦрд┐рд░реА рдЪреАрдЬрд╝ рдЬреЛ рдмрдиреА рд╣реБрдИ рд╣реИ рд╡рд╣ рд╣реИ рд╣рдорд╛рд░реЗ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд┐рд░ рд╕реЗ security.yml рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдЗрд╕рдореЗрдВ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ:

  ...   
     рдлрд╛рдпрд░рд╡реЙрд▓:
         myauth:
             рдкреИрдЯрд░реНрди: ^ /
             # рдмреНрд▓реЙрдХ рдореЗрдВ рд╣рдорд╛рд░реЗ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХреЛ рдирд┐рдпрдорд┐рдд form_login рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, 
             # рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред
             mysocial:  
                 check_path: / login / socialauth
                 login_path: / рд▓реЙрдЧрд┐рди / рдореЗрдВ
             # рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛рдПрдВ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╕рд┐рдореНрдлрдиреА рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╢рд░реНрддреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреА,
             # рддрд╛рдХрд┐ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░реЗрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ check_path рдХрд░реЗрдВ
             form_login:
                 check_path: / рд▓реЙрдЧрд┐рди / рдСрд░реНрдЯ
                 login_path: / рд▓реЙрдЧрд┐рди / рдореЗрдВ
	      # рд╣рдо 2 рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╣реИ 
             # рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП
             рд▓реЙрдЧрдЖрдЙрдЯ:
                 рдкрде: / рд▓реЙрдЧрд┐рди / рдмрд╛рд╣рд░
                 рд▓рдХреНрд╖реНрдп: /
                 рдЕрдорд╛рдиреНрдп_рд╕реЗрд╢рди: рд╕рдЪ рд╣реИ
             рдЕрдирд╛рдо: ~
 ... 


рд╡рд╣ рд╕рдм рд╣реИред рд▓реЙрдЧрд┐рди рдлреЙрд░реНрдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ VKontakte рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдХрд░, рд╣рдо рдЗрд╕ рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдЧ рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреЗрдЯрд╡рд░реНрдХред

рдкрд░рд┐рдгрд╛рдо


рд╢реБрд░реБрдЖрдд рд╕реЗ рд╕рд┐рдореНрдлрдиреА 2.0 рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рдЬрдЯрд┐рд▓ рдФрд░ рднреНрд░рд╛рдордХ рд▓рдЧ рд╕рдХрддреА рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ рдФрд░ рднреНрд░рд╛рдордХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рджреВрд╕рд░реЗ рдФрд░ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдВрдЧрдарди рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдкреНрд░рд╡реГрддреНрддрд┐ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реНрддрд░ рдкрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╣рдореЗрдВ рд▓реЙрдЧрд┐рди / рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдлреЙрд░реНрдо рдХреЛ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛), рд╣рдореЗрдВ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЙрдЧрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реАред рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрддреНрд╡реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд▓рдЪреАрд▓реА рд╕реБрд░рдХреНрд╖рд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In134005/


All Articles