рд╡рд╕рдВрдд рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ MongoDB рдХреЗ рд╕рд╛рде рд░реАрд╕реНрдЯ рдПрдкреАрдЖрдИ рдкреНрд░рдорд╛рдгреАрдХрд░рдг

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝рддреЗ рд╣реБрдП, рд╣рдо рдЖрдкрдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдЦ рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж "рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдбреЗрд╡рд▓рдкрд░" рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред





рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ RESTful рд╡реЗрдм рд╕реЗрд╡рд╛ рдмрдирд╛рдИ рдереА, рдЕрдм рд╣рдо рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ

рдкрд░рд┐рдЪрдп


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

рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ рдХреЛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?


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

рдпрд╣ рдХрд╛рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ


рд╣рдо рдореВрд▓ HTTP рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ , рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдЙрдкрдирд┐рд╡реЗрд╢ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ username:passwordред

рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдлрд┐рд░ рдмреЗрд╕ 64 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рд▓рд╛рдЗрди admin:p@55w0RdрдХреЛ рдЕрдЧрд▓реА рд▓рд╛рдЗрди рдореЗрдВ рдЗрдирдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ YWRtaW46cEA1NXcwUmQ=(рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ "p @ 55w0Rd" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛)ред рд╣рдо рд╣реЗрдбрд░ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рдЕрдкрдиреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ Authenticationред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рд╢реАрд░реНрд╖рдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (рдЬрд╣рд╛рдБ "рдмреЗрд╕рд┐рдХ" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдмреБрдирд┐рдпрд╛рджреА HTTP рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ):

Authentication: Basic YWRtaW46cEA1NXcwUmQ=

рдХреИрд╕реЗ рд╡рд╕рдВрдд рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ


рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдХ рдРрдб-рдЗрди рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╣рд▓рд╛рддрд╛ рд╣реИ , рдЬреЛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдФрд░ рдмреЗрд╣рдж рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред рд╣рдо рдХреБрдЫ рдРрд╕реЗ рдХреМрд╢рд▓реЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕реАрдЦреЗ рдереЗ рдЬрдм рд╕реЗрдЯ рдЕрдк рдХрд┐рдпрд╛ рдерд╛!

рд╣рдорд╛рд░реА рдЬрд░реВрд░рддреЗрдВ рдХреНрдпрд╛ рд╣реИрдВ


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

рдкрд╛рд╕рд╡рд░реНрдб рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП BCrypt


рд╣рд╛рд╢рд┐рдВрдЧ рдПрдХ рддрд░рд╣ рд╕реЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореВрд▓ рдбреЗрдЯрд╛ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рдерд╛ред BCrypt рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд╣рд▓реЗ рдкрд╛рда рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд▓рд╡рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ 60 рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рдмреАрд╕реАрдХреНрд░рд┐рдкреНрдЯ рдПрдирдХреЛрдбрд░ рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ matchesрдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрд╢ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, p@55w0RdBCrypt рдХреЗ рд╕рд╛рде рд╣реИрд╢ рдХрд┐рдП рдЧрдП рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдПрдХ рдЕрд░реНрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ $2b$10$Qrc6rGzIGaHpbgPM5kVXdeNZ9NiyRWC69Wk/17mttHKnDR2lW49KSред matchesрдПрдХ рдЕрдирдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдФрд░ рд╣реИрд╢реЗрдб рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдмреАрд╕реАрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдорд┐рд▓рддрд╛ рд╣реИ trueред рдЗрди рд╣реИрд╢ рдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдмреАрд╕реАрдХреНрд░рд┐рдкреНрдЯ рдПрдирдХреЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╛рд╕рд╡рд░реНрдб рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?


рд╣рдо рд╕рднреА рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рд╛рдЗрдмрд░ рд╣рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрдбрд╝реА рдХрдВрдкрдирд┐рдпреЛрдВ рд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рдЪреЛрд░реА рд╣реЛ рдЧрдПред рддреЛ рд╣реИрдХрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреНрдпреЛрдВ рдХреА рдЬрд╛рддреА рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдмрдбрд╝реА рдХрдВрдкрдирд┐рдпреЛрдВ рдиреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдкрд╛рд╕рд╡рд░реНрдб рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╣реИрд╢реЗрдб рд╣реЛ!

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рд╣реИрдХ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдкрд╛рд╕рд╡рд░реНрдб рдмрджрд▓рдирд╛ рд╣рдореЗрд╢рд╛ рд▓рд╛рдпрдХ рд╣реЛрддрд╛ рд╣реИ, рд╣реИрд╢рд┐рдВрдЧ рдкрд╛рд╕рд╡рд░реНрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрд╕рд▓реА рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдвреВрдВрдврдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рддрд░рдлрд╝рд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдЬрдЯрд┐рд▓ рдкрд╛рд╕рд╡рд░реНрдб рд╣реИрд╢реЗрдб рдХреЛ рдареАрдХ рд╕реЗ рдХреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рд╡рд░реНрд╖реЛрдВ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВ ред рдпрд╣ рдкрд╛рд╕рд╡рд░реНрдб рдЪреЛрд░реА рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрддрд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рд╣реИрд╢рд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрд╕рд▓реА рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: "рдХреНрдпреЛрдВ рдирд╣реАрдВ?"

MongoDB рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛


рдореИрдВ рдЕрдкрдиреЗ рд╕рдВрдЧреНрд░рд╣ users(рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдлрд╝реАрд▓реНрдб usernameрдЬреЛрдбрд╝реВрдВрдЧрд╛ , рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдХреЗрд╡рд▓ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо) рдФрд░ рд╣реИрд╢реЗрдб рдмреАрд╕реАрдХреНрд░рд┐рдкреНрдЯ password(рдкрд╛рд╕рд╡рд░реНрдб) рд╣реЛрдЧрд╛ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рд╣реЛрдЧрд╛ admin, рдФрд░ рдореЗрд░рд╛ рдкрд╛рд╕рд╡рд░реНрдб рд╣реЛрдЧрд╛ welcome1, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрддреНрдкрд╛рджрди рд╕реНрддрд░ рдПрдкреАрдЖрдИ рдореЗрдВ рдПрдХ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ ред

db.users.insert({
  тАЬusernameтАЭ : тАЬadminтАЭ,
  тАЬpasswordтАЭ : тАЬ$2a$10$AjHGc4x3Nez/p4ZpvFDWeO6FGxee/cVqj5KHHnHfuLnIOzC5ag4fmтАЭ
});

рдпреЗ рд╕рднреА MongoDB рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ! рдмрд╛рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣рдорд╛рд░реЗ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЬреЛрдбрд╝рдирд╛


рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдореЛрдВрдЧреЛ рдХреЗ рдореЙрдбрд▓ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рджреВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдпрд╣рд╛рдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдкрд░ рдЬрд╛рдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВ!

рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ user(рдореЙрдбрд▓) рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ рдФрд░ userрдбреЗрдЯрд╛рдмреЗрд╕ (рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдП ред рд╣рдо рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреНрд░рдорд╢рдГ рдореЙрдбрд▓ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдПрдХ рд╣реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛ред

рдирдореВрдирд╛


рдореЙрдбрд▓ рдХрд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╛рд╡рд╛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╣реЛрдЧрд╛ _id, usernameрдФрд░ passwordред рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ Users.javaред рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

package com.example.gtommee.rest_tutorial.models;

import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;

public class Users {
  @Id
  public ObjectId _id;

  public String username;
  public String password;

  public Users() {}

  public Users(ObjectId _id, String username, String password) 
{
    this._id = _id;
    this.username = username;
    this.password = password;
  }

  public void set_id(ObjectId _id) { this._id = _id; }

  public String get_id() { return this._id.toHexString(); }

  public void setPassword(String password) { this.password = password; }

  public String getPassword() { return password; }

  public void setUsername(String username) { this.username = username; }

  public String getUsername() { return username; }
}

рдХреЛрд╖


рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдмреБрд▓рд╛рдпрд╛ UsersRepository.javaрдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ - рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА username, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ findByUsernameрд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред

package com.example.gtommee.rest_tutorial.repositories;

import com.example.gtommee.rest_tutorial.models.Users;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface UsersRepository extends MongoRepository<Users, String> {
  Users findByUsername(String username);
}

рдФрд░ рдпрд╣ рдореЙрдбрд▓ рдФрд░ рднрдВрдбрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реИ!

рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рдирд╛


рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╛рдЗрд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП pom.xmlред рд╣рдордиреЗ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЫреБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдкреЛрдо рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВ, рдФрд░ рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдФрд░ рдЯреИрдЧ рдХреЛ рдиреАрдЪреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ред рдПрдХрдорд╛рддреНрд░ рдирдИ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рд╡рд╕рдВрдд-рд╕реНрдЯрд╛рд░реНрдЯрд░-рд╕реБрд░рдХреНрд╖рд╛ ред рд╡рд╕рдВрдд рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдмрдВрдзрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЯреИрдЧ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:<dependencies>

<dependencies>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

рдФрд░ рдорд╛рд╡реЗрди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!

рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗрд╡рд╛ рдмрдирд╛рдПрдБ


рд╣рдореЗрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рд╣реИ рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХрд╣рд╛рдВ рдорд┐рд▓реЗрдЧреАред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗрд╡рд╛ (рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗрд╡рд╛) рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд▓реЛ src/main/resources/java/[package name]рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдПрдХ рдирдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдирд╛рдо рдХреЗ рд╕рд╛рде рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ MongoUserDetailsService.javaред

MongoUserDetailsService.java


рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдореБрдЦреНрдп рдШрдЯрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреВрд░реА рдХрдХреНрд╖рд╛ рдХреЛ рдпрд╣рд╛рдБ рджреЗрддрд╛ рд╣реВрдБ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдиреАрдЪреЗ рд╕рдордЭрд╛рддрд╛ рд╣реВрдБ:

package com.example.gtommee.rest_tutorial.services;

import com.example.gtommee.rest_tutorial.models.Users;
import com.example.gtommee.rest_tutorial.repositories.UsersRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@Component
public class MongoUserDetailsService implements UserDetailsService{
  @Autowired
  private UsersRepository repository;

  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    Users user = repository.findByUsername(username);

    if(user == null) {
      throw new UsernameNotFoundException(тАЬUser not foundтАЭ);
    }

    List<SimpleGrantedAuthority> authorities = Arrays.asList(new SimpleGrantedAuthority(тАЬuserтАЭ));

    return new User(user.getUsername(), user.getPassword(), authorities);
  }
}

рдпрд╣ рд╕реНрдирд┐рдкреЗрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрдпрд╛рдд рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреБрднрд╛рдЧ implements UserDetailsServiceрдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ред рдлрд┐рд░, рдПрдиреЛрдЯреЗрд╢рди @ComponentрдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SecurityConfiguration рдлрд╝рд╛рдЗрд▓, рдЬрд┐рд╕реЗ рд╣рдо рдХрдИ рдЦрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ)ред

рдПрдиреЛрдЯреЗрд╢рди @AutowiredрдХреЗ рдКрдкрд░ private UsersRepository repository; рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рд╣рдореЗрдВ UsersRepositoryрдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ ред рдПрдиреЛрдЯреЗрд╢рди @OverrideрдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ UserDetailsService рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╡рд┐рдзрд┐ UsersрдЙрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП MongoDB рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ findByUsernameрдЬрд┐рд╕реЗ рд╣рдордиреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдерд╛ UsersRepositoryред

рд╡рд┐рдзрд┐ рддрдм рдЬрд╛рдВрдЪрддреА рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд┐рд▓рд╛ рдпрд╛ рдирд╣реАрдВред рддрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдиреБрдорддрд┐рдпрд╛рдБ / рднреВрдорд┐рдХрд╛ рджреА рдЬрд╛рддреА рд╣реИ (рдпрд╣ рдПрдХреНрд╕реЗрд╕ рд╕реНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реНрддрд░ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд╛рда рдХреЗ рд▓рд┐рдП рдПрдХ рднреВрдорд┐рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧреА)ред рдЕрдВрдд рдореЗрдВ, рд╡рд┐рдзрд┐ рд░рд┐рдЯрд░реНрди рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡рд╕реНрддреБ UserрдХреЗ рд╕рд╛рде username, passwordрдФрд░ roleрдкреНрд░рдорд╛рдгреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ред

рд╕реБрд░рдХреНрд╖рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдПрдБ


рд╣рдореЗрдВ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рдХреБрдЫ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ src/main/resources/java/[package name]рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ config, рдФрд░ рд╣рдореЗрдВ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ SecurityConfiguration.javaред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП SecurityConfiguration рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

SecurityConfiguration.java


package com.example.gtommee.rest_tutorial.config;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableConfigurationProperties
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
 @Autowired
 MongoUserDetailsService userDetailsService;
}

рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рддреЛ рдЪрд▓реЛ рдКрдкрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдПрдиреЛрдЯреЗрд╢рди @ConfigurationрдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛ рдореЗрдВ рдЬрд╛рд╡рд╛ рдмреАрдиреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рдпрд╣рд╛рдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдПрдиреЛрдЯреЗрд╢рди @EnableConfigurationPropertiesрдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмреАрди рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рддрдм рдирд┐рд░реНрджреЗрд╢ рд╣рдорд╛рд░реЗ extends WebSecurityConfigurerAdapterрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд░реНрдЧ рдХреЗ WebSecurityConfigurerAdapterрд▓рд┐рдП рдореВрд▓ рд╡рд░реНрдЧ рдХреЛ рдореИрдк рдХрд░реЗрдЧрд╛ , рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдХрд┐ рдЙрд╕рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдореЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрдВрдд рдореЗрдВ, рдХреНрд▓рд╛рд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ ( @Autowired) рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдЧреА MongoUserDetailsService, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрджрдо


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

@Override
protected void configure(HttpSecurity http) throws Exception {
 http
   .csrf().disable()
   .authorizeRequests().anyRequest().authenticated()
   .and().httpBasic()
   .and().sessionManagement().disable();
}

рдлрд┐рд░ рд╕реЗ, рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рдпрд╣рд╛рдВ рд╣реЛ рд░рд╣реА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣рд▓ рдХрд░реЗрдВрдЧреЗред рдПрдиреЛрдЯреЗрд╢рди @Overrideрд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХреЛ configure (HttpSecurity http)рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╣рддреЗ рд╣реИрдВ httpрдЬрд╣рд╛рдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реЛрддрд╛ рд╣реИред рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИрдВ:

  • csrf().disable(): CSRF рд╕реБрд░рдХреНрд╖рд╛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ
  • authorizeRequests().anyRequest().authenticated(): рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдЙрдиреНрд╣реЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • and().httpBasic(): Springрддрд╛рдХрд┐ рдпрд╣ рдореВрд▓рднреВрдд HTTP рдкреНрд░рдорд╛рдгреАрдХрд░рдг (рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ) рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗред
  • .and().sessionManagement().disable(): рд╕реНрдкреНрд░рд┐рдВрдЧ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рддреНрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ

рдПрдХ Bcrypt рдПрдирдХреЛрдбрд░ рдЬреЛрдбрд╝рдирд╛


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

@Bean
public PasswordEncoder passwordEncoder() {
   return new BCryptPasswordEncoder();
}

рдФрд░ рд╕рдм рдХрд╛рдо! рдпрд╣ рд╕рд░рд▓ рдмреАрди рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдкрд╛рд╕рд╡рд░реНрдбрдПрдиреНрдХреЛрдбрд░ рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡рд╣ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ BCryptPasswordEncoder()рд╣реИ, рдЬреЛ рдкрд╛рд╕рд╡рд░реНрдб рд╣реИрд╢ рдХреЛ рдПрдирдХреЛрдб рдФрд░ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ ред рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдореЗрдВ рдХрдИ рдЕрдиреНрдп рдкрд╛рд╕рд╡рд░реНрдб рдПрдирдХреЛрдбрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - рдЕрдЧрд░ рдЖрдк рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ!

рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдмрдВрдзрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ


рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдмрдирд╛рдпрд╛ рдерд╛) SecurityConfigurationрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ MongoUserDetailsServiceред рд╣рдо рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

@Override
public void configure(AuthenticationManagerBuilder builder) 
throws Exception {
  builder.userDetailsService(userDetailsService);
}

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

рдЕрдВрддрд┐рдо SecurityConfiguration.java рдлрд╝рд╛рдЗрд▓


import com.example.gtommee.rest_tutorial.services.MongoUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableConfigurationProperties
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
 @Autowired
 MongoUserDetailsService userDetailsService;

 @Override
 protected void configure(HttpSecurity http) throws Exception {
   http
     .csrf().disable()
     .authorizeRequests().anyRequest().authenticated()
     .and().httpBasic()
     .and().sessionManagement().disable();
 }

 @Bean
 public PasswordEncoder passwordEncoder() {
   return new BCryptPasswordEncoder();
 }

 @Override
 public void configure(AuthenticationManagerBuilder builder) 
throws Exception {
   builder.userDetailsService(userDetailsService);
 }
}

рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рдЬрд╛рдБрдЪ


рдореИрдВ GETрдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдз рдФрд░ рдЧрд▓рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд╡рд░рд┐рдд рдЕрдиреБрд░реЛрдз рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд┐рдпреЛрдЬрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЧрд▓рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо / рдкрд╛рд╕рд╡рд░реНрдб

URL: http://localhost:8080/pets/
рд╡рд┐рдзрд┐: GET
рд▓реЙрдЧрд┐рди: Basic YWRtaW46d2VsY29tZQ==

рдЙрддреНрддрд░:

401 Unauthorized

рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо / рдкрд╛рд╕рд╡рд░реНрдб

URL: http://localhost:8080/pets/
рд╡рд┐рдзрд┐: GET
рд▓реЙрдЧрд┐рди: Basic YWRtaW46d2VsY29tZTE=

рдЙрддреНрддрд░:

[
 {
   тАЬ_idтАЭ: тАЬ5aeccb0a18365ba07414356cтАЭ,
   тАЬnameтАЭ: тАЬSpotтАЭ,
   тАЬspeciesтАЭ: тАЬdogтАЭ,
   тАЬbreedтАЭ: тАЬpitbullтАЭ
 },
 {
   тАЬ_idтАЭ: тАЬ5aeccb0a18365ba07414356dтАЭ,
   тАЬnameтАЭ: тАЬDaisyтАЭ,
   тАЬspeciesтАЭ: тАЬcatтАЭ,
   тАЬbreedтАЭ: тАЬcalicoтАЭ
 },
 {
   тАЬ_idтАЭ: тАЬ5aeccb0a18365ba07414356eтАЭ,
   тАЬnameтАЭ: тАЬBellaтАЭ,
   тАЬspeciesтАЭ: тАЬdogтАЭ,
   тАЬbreedтАЭ: тАЬaustralian shepardтАЭ
 }
]

рдирд┐рд╖реНрдХрд░реНрд╖


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

рдмрд╕ рдЗрддрдирд╛ рд╣реА! рдореБрдЭреЗ рдХреЛрд░реНрд╕ рдкрд░ рдорд┐рд▓реЛ ред

All Articles