рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝рддреЗ рд╣реБрдП, рд╣рдо рдЖрдкрдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдЦ рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж "рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдбреЗрд╡рд▓рдкрд░" рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ 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@55w0Rd
BCrypt рдХреЗ рд╕рд╛рде рд╣реИрд╢ рдХрд┐рдП рдЧрдП рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдПрдХ рдЕрд░реНрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ $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 рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред рдЖрдЬ рдХреЗ рд╕рд╛рдЗрдмрд░ рдорд╛рд╣реМрд▓ рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреА рдЕрдЦрдВрдбрддрд╛ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВредрдмрд╕ рдЗрддрдирд╛ рд╣реА! рдореБрдЭреЗ рдХреЛрд░реНрд╕ рдкрд░ рдорд┐рд▓реЛ ред