рд╢реБрдн рджреЛрдкрд╣рд░
рдпрд╣ рд▓реЗрдЦ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд╛рдЗрдЯ рдХреЗ рдкреГрд╖реНрдареЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░реЗрдЧрд╛ред
рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рднреВрдорд┐рдХрд╛рдУрдВ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдЯ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреГрд╖реНрдареЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрд╡реЗрджрди рдХреНрдпрд╛ рд╣реЛрдЧрд╛
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕рд╛рде рд╡реЗрдмрд╕рд╛рдЗрдЯ:
- рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рдкреГрд╖реНрда: рдШрд░, рдкрдВрдЬреАрдХрд░рдг рдФрд░ рд▓реЙрдЧрд┐рди;
- рдкрдВрдЬреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдкреГрд╖реНрда: рд╕рдорд╛рдЪрд╛рд░;
- рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреГрд╖реНрда рдЙрдкрд▓рдмреНрдз рд╣реИред
рд╣рдо рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ
- рдЬреЗрдбреАрдХреЗ 8+;
- рдЗрдВрдЯреЗрд▓реАрдЬ рдЖрдЗрдбрд┐рдпрд╛;
- рд╕реНрдкреНрд░рд┐рдВрдЧ (рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА, рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА);
- рд╣рд╛рдЗрдмрд░рдиреЗрдЯ;
- JSP;
- PostgreSQLред
рд╕рд╛рдордЧреНрд░реА
- рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдореБрдЦреНрдп рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рд╡рд┐рд╡рд░рдгред
- IDE рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред
- рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ (рдкреИрдХреЗрдЬ) рдмрдирд╛рдирд╛ред
- рд╕рдВрд╕реНрдерд╛рдУрдВ, рдирд┐рдпрдВрддреНрд░рдХреЛрдВ, рд╕реЗрд╡рд╛рдУрдВ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ред
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪред
1. рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдореБрдЦреНрдп рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рд╡рд┐рд╡рд░рдг
MVC рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ
рдирд┐рдпрдВрддреНрд░рдХ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдЧ рд╣реИред рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд HttpServlet рд╕рд░реНрд╡рд▓реЗрдЯ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ HttpServletRequest рдФрд░ HttpServletResponse рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рдеред
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реВрдЪреА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдбреЗрдЯрд╛ рдЦреЛрдЬрдиреЗ, рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпред рдбреАрдПрдУ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реЗрд╡рд╛ - рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╡рд░реНрдЧ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рд╣реИред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди - рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдмреАрди рдШрдЯрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрд╡рддрдГ-
рдкреНрд░рд╕рд╛рд░рд┐рдд - рдПрдиреЛрдЯреЗрд╢рди рдЖрдкрдХреЛ рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдмреАрди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдмреАрди рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХреИрд╕реЗ рдкрд╛рд╕ рдХрд░рдиреА рд╣реИред рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдмреАрди рдорд┐рд▓реЗрдЧрд╛ рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ред
рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдЬрд╛рдирдХрд╛рд░реА
рд╕рдмрд╕реЗ рдореМрд▓рд┐рдХ рд╡рд╕реНрддреБ
SecurityContextHolder рд╣реИ ред рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реБрд░рдХреНрд╖рд╛ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдкреНрд░рд┐рдВрд╕рд┐рдкрд▓) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдПрдХ
рдСрдереЗрдВрдЯрд┐рдХреЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ, рдПрдХ рдЕрдзрд┐рдХреГрдд рд╕рддреНрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдПрдХ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рд╕рд┐рд░реНрдл рдПрдХ рд╡рд╕реНрддреБ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
UserDetails рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдбрд╛рд▓реАред
UserDetails рдХреЛ рдпреВрдЬрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдХреЗ рд▓рд┐рдП SecurityContextHolder рдХреЗ рдмреАрдЪ рдПрдбреЙрдкреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
UserDetails рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП,
UserDetailsService рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдПрдХрд▓ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
2. рдЖрдИрдбреАрдИ рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛
рд╣рдо рдорд╛рд╡реЗрди рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
GroupId рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрдВрдкрдиреА рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдпрд╛ рдЖрдкрдХрд╛ рдирд┐рдЬреА рдбреЛрдореЗрди рдирд╛рдо) рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред
ArtefactId рд╕рд┐рд░реНрдл рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рд╣реИред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, pom.xml рдлрд╝рд╛рдЗрд▓
рдЦреБрд▓рддреА рд╣реИ , Idea рдСрдЯреЛ-рдЖрдпрд╛рдд рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧрд╛ - рдордирд╛ рди рдХрд░реЗрдВред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдБ (рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рд╣реЛрдВрдЧреАред

3. рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ (рд╕рдВрдХреБрд▓) рдмрдирд╛рдирд╛
рддреБрд░рдВрдд рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛, рдЬрд┐рд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдм рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдХреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
- src \ main \ java \ com \ boot \ config - MVC (MvcConfig) рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ (WebSecurityConfig) рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдПрдВ;
- src \ main \ java \ com \ рдЬреВрддреЗ \ рдирд┐рдпрдВрддреНрд░рдХ - рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдПрдВ;
- src \ main \ java \ com \ рдмреВрдЯреА \ рд╕рдВрд╕реНрдерд╛ - рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдПрдВ;
- src \ main \ java \ com \ boot \ repository - рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЗрдВрдЯрд░рдлреЗрд╕;
- src \ main \ java \ com \ рдЬреВрддреЗ \ рд╕рд░реНрд╡рд┐рд╕ - рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдПрдВ;
- src \ main \ webapp \ resource - рд╕реНрдерд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ: js, css, img;
- src \ main \ webapp \ WEB-INF \ jsp - .jsp рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ред
Pom.xml рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЖрдкрдХреЛ
рдореВрд▓ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд▓рд┐рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддред рдЗрд╕ рдЪрд╛рдЗрд▓реНрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рд╕рднреА рд╕рдВрдкрддреНрддрд┐рдпрд╛рдБ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдЬреЛрдбрд╝реА рдЬрд╛рдПрдБрдЧреАред
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version> </parent>
рдЕрдЧрд▓рд╛, рд╕реНрдкреНрд░рд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓, PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░, рдЯреЙрдордХреИрдЯ рд╕рд░реНрд╡рд░, JSTL рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЬреЛрдбрд╝реЗрдВред
<properties> <java.version>1.8</java.version> </properties>
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдорд╛рд╡реЗрди рдЬрд╛рд╡рд╛ 1.6 рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.8</version> <scope>runtime</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>9.0.27</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> <version>5.2.0.RELEASE</version> </dependency> </dependencies>
рд╣рдо рдПрдХ рдкреНрд▓рдЧрдЗрди рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЬрд╛рд░ рдпрд╛ рдпреБрджреНрдз рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдкреИрдХ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ "рд╕реНрдерд╛рди рдкрд░" рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
рдкреВрд░реНрдг pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ark</groupId> <artifactId>spring</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>9.0.27</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> <version>5.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> <properties> <java.version>1.8</java.version> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Application.properties рдлрд╝рд╛рдЗрд▓ рднрд░реЗрдВред рдкрд╣рд▓реА 3 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ (рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдирд╛рдо "рд╕реНрдкреНрд░рд┐рдВрдЧ", рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рд╣реИ)ред рдЕрдВрддрд┐рдо 2 рд▓рд╛рдЗрдиреЗрдВ .jsp рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИрдВ:
spring.datasource.url=jdbc:postgresql://localhost/spring spring.datasource.username=postgres spring.datasource.password=password spring.jpa.show-sql=true spring.jpa.generate-ddl=false spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true spring.mvc.view.prefix = /WEB-INF/jsp/ spring.mvc.view.suffix = .jsp
Spring.jpa.show-sql рдкреНрд░реЙрдкрд░реНрдЯреА рдХрдВрд╕реЛрд▓ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реАрдЬрд╝ рдХреА рдмреЙрдбреАрдЬрд╝ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред
spring.jpa.hibernate.ddl- рдСрдЯреЛ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдгрдиреАрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; рдЗрд╕рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореВрд▓реНрдп рд╣реИрдВ (рдХреЛрдИ рдирд╣реАрдВ, рдмрдирд╛рдПрдВ, рдЕрдкрдбреЗрдЯ, рдЖрджрд┐)ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ
рдЕрдкрдбреЗрдЯ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдЯреЗрдмрд▓ рдФрд░ рдлрд╝реАрд▓реНрдб рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВрдЧреЗред
рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдирд╛рдо
рд╡рд╕рдВрдд рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛рдПрдВ, рднреВрдорд┐рдХрд╛рдПрдВ рдФрд░ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдирдХреА рд▓рд┐рдВрдХ рддрд╛рд▓рд┐рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореЙрдбрд▓ (рдЗрдХрд╛рдИ рдкреИрдХреЗрдЬ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА, рдЬрд┐рд╕реЗ рд╣рдо рдЕрдм рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред
4. рд╕рдВрд╕реНрдерд╛рдУрдВ, рдирд┐рдпрдВрддреНрд░рдХреЛрдВ, рд╕реЗрд╡рд╛рдУрдВ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛
4.1ред рдПрдВрдЯрд┐рдЯреАрдЬ (рдореЙрдбрд▓) рдЬреЛрдбрд╝рдирд╛
рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ : рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░, рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдФрд░ рдПрдХ рдЦрд╛рд▓реА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, Alt + рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ рджрдмрд╛рдПрдВ рдФрд░ рдЖрдЗрдбрд┐рдпрд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд░ рджреЗрдЧрд╛ред
рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреАрдмреЛрд░реНрдб рд╢реЙрд░реНрдЯрдХрдЯ Alt + Enter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ @Entity @Table(name = "t_user") public class User implements UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Size(min=2, message = " 5 ") private String username; @Size(min=2, message = " 5 ") private String password; @Transient private String passwordConfirm; @ManyToMany(fetch = FetchType.EAGER) private Set<Role> roles; public User() { } public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Override public String getUsername() { return username; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } public void setUsername(String username) { this.username = username; } @Override public Collection<? extends GrantedAuthority> getAuthorities() { return getRoles(); } @Override public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPasswordConfirm() { return passwordConfirm; } public void setPasswordConfirm(String passwordConfirm) { this.passwordConfirm = passwordConfirm; } public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } }
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ред рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ:
рдЗрдХрд╛рдИ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдирдХреНрд╢рд╛ рд╣реИ,
рддрд╛рд▓рд┐рдХрд╛ (рдирд╛рдо = "t_user") рдХрд┐рд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
GenerationType.IDENTITY IDENTITY рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдИрдбреА рдмрдирд╛рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реЛрдЧрд╛ред рдЕрдиреНрдп рд░рдгрдиреАрддрд┐рдпрд╛рдБ рд╣реИрдВред рдЕрдиреБрдХреНрд░рдо - рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ PostgreSQL рдпрд╛ Oracle, рдЕрдиреБрдХреНрд░рдорд┐рдХ рдорд╛рди (рдЕрдиреБрдХреНрд░рдо) рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ред рдЯреЗрдмрд▓ - рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреБрдВрдЬреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдСрдЯреЛ рд╣реИ, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд╕реНрд╡рдпрдВ рдЙрдкрд░реЛрдХреНрдд рд░рдгрдиреАрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░рдгрдиреАрддрд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИред
рдХреНрд╖рдгрд┐рдХ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рддрд╣рдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рд╣реИред рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИ, рдХрдИ-рд╕реЗ-рдХрдИ рд╕рдВрдмрдВрдз (рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдПрдХ рддрд░рдл рдХрдИ рднреВрдорд┐рдХрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдПрдХ рднреВрдорд┐рдХрд╛ рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ);
FetchType.EAGER - "рд▓рд╛рд▓рдЪреА" рдбрд╛рдЙрдирд▓реЛрдб, рдЕрд░реНрдерд╛рддреН рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рддреБрд░рдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм рддрдХ рд╡реЗ рд╕рдВрдкрд░реНрдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред
рд╡рд╕рдВрдд рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдХрд╛ рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдЯреЗрд▓реНрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓
getAuthorities () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╡рд╛рдкрд╕реА рдорд╛рди рдХреЛ
рд╕рдЪ рдореЗрдВ рдмрджрд▓реЗрдВред
рднреВрдорд┐рдХрд╛ @Entity @Table(name = "t_role") public class Role implements GrantedAuthority { @Id private Long id; private String name; @Transient @ManyToMany(mappedBy = "roles") private Set<User> users; public Role() { } public Role(Long id) { this.id = id; } public Role(Long id, String name) { this.id = id; this.name = name; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<User> getUsers() { return users; } public void setUsers(Set<User> users) { this.users = users; } @Override public String getAuthority() { return getName(); } }
рднреВрдорд┐рдХрд╛ред рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ
GrantedAuthority рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ
getAuthority () рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рднреВрдорд┐рдХрд╛ рдХрд╛ рдирд╛рдо рджреЗрддрд╛ рд╣реИ)ред рднреВрдорд┐рдХрд╛ рдирд╛рдо рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: "ROLE_NAME", рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
ROLE_USER ред рдбрд┐рдлреЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рдкрдмреНрд▓рд┐рдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛: рдкрд╣рд▓рд╛ рдХреЗрд╡рд▓ рдЖрдИрдбреА, рджреВрд╕рд░рд╛ рдЖрдИрдбреА рдФрд░ рдирд╛рдо рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдЖрдк рдлрд╝реАрд▓реНрдб рдкреНрд░рддрд┐рдмрдВрдз рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдХрд╛рд░ (рдиреНрдпреВрдирддрдо = 2) - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреНрд╖реЗрддреНрд░ рдХреА рдиреНрдпреВрдирддрдо рд▓рдВрдмрд╛рдИ 2 рд╣реИ, рдпрджрд┐ рдкреНрд░рддрд┐рдмрдВрдз рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
4.2ред рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рд▓реЗрдпрд░ рдФрд░ рд╕рд░реНрд╡рд┐рд╕ рд▓реЗрдпрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛
рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдПрдХ рдкрд░рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
JpaRepository рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╡рд┐рдзрд┐рдпреЛрдВ (findBy, save, deleteById, рдЖрджрд┐) рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
UserRepositoryред рд╣рдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкреИрдХреЗрдЬ рдореЗрдВ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░
JpaRepository <User, Long> рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ,
рдпреВрдЬрд░ рдХреНрд▓рд╛рд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ id рдЯрд╛рдЗрдк
рд▓реЙрдиреНрдЧ рд╣реИ ред
public interface UserRepository extends JpaRepository<User, Long> { User findByUsername(String username); }
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрд╕ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдХрд░ рдФрд░
JpaRepository рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ
рджреЗрдХрд░, рдЖрдк рдорд╛рдирдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдЗрд╕реЗ рдЖрдЗрдбрд┐рдпрд╛ рдЯрд┐рдкреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд╛рдо рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рд▓реМрдЯреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЖрдИрдбреАрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рд╡рд┐рдзрд┐ рдкрд░
рдХреНрд╡реЗрд░реА рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдЪрдХреНрдпреВрдПрд▓ рдпрд╛ рдПрд╕рдХреНрдпреВрдПрд▓ рдореЗрдВ рдкреНрд░рд╢реНрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХреНрд╕ = = рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
@Query(value = "SELECT nextval(pg_get_serial_sequence('t_user', 'id'))", nativeQuery = true) Long getNextId();
RoleRepositoryред рд╣рдо рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
public interface RoleRepository extends JpaRepository<Role, Long> { }
UserServiceред рдЖрд╡реЗрджрди рдХреЗ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рд╡рд░реНрдЧ
UserDetailsService рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ
loadUserByUsername () рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рдЖрдк SQL рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ - EntityManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрд╡рд╛ @Service public class UserService implements UserDetailsService { @PersistenceContext private EntityManager em; @Autowired UserRepository userRepository; @Autowired RoleRepository roleRepository; @Autowired BCryptPasswordEncoder bCryptPasswordEncoder; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found"); } return user; } public User findUserById(Long userId) { Optional<User> userFromDb = userRepository.findById(userId); return userFromDb.orElse(new User()); } public List<User> allUsers() { return userRepository.findAll(); } public boolean saveUser(User user) { User userFromDB = userRepository.findByUsername(user.getUsername()); if (userFromDB != null) { return false; } user.setRoles(Collections.singleton(new Role(1L, "ROLE_USER"))); user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); userRepository.save(user); return true; } public boolean deleteUser(Long userId) { if (userRepository.findById(userId).isPresent()) { userRepository.deleteById(userId); return true; } return false; } public List<User> usergtList(Long idMin) { return em.createQuery("SELECT u FROM User u WHERE u.id > :paramId", User.class) .setParameter("paramId", idMin).getResultList(); } }
SaveUser (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛) рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
public boolean saveUser(User user) { User userFromDB = userRepository.findByUsername(user.getUsername()); if (userFromDB != null) { return false; } user.setRoles(Collections.singleton(new Role(1L, "ROLE_USER"))); user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); userRepository.save(user); return true; }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИ, рдпрджрд┐ рдПрдХ рд╣реА рдирд╛рдо рд╡рд╛рд▓рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рддреЛ рд╡рд┐рдзрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ ROLE_USER рднреВрдорд┐рдХрд╛ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИред рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдХрдЪреНрдЪреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрд╣рд▓реЗ
bCryptPasswordEncoder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рд╣реИрд╢реЗрдб рд╣реИ ред рдлрд┐рд░ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
4.3ред рдирд┐рдпрдВрддреНрд░рдХ рдЬреЛрдбрд╝рдирд╛
рдЙрди рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╕ рдкреГрд╖реНрда рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдореИрдкрд┐рдВрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ
рд▓реЙрдЧрд┐рди рдкреЗрдЬ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдХрдВрдЯреНрд░реЛрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
@Configuration public class MvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/login").setViewName("login"); registry.addViewController("/news").setViewName("news"); } }
RegistrationControllerред рдкрдВрдЬреАрдХрд░рдг рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред GET рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, POST -
@PostMapping ("/ рдкрдВрдЬреАрдХрд░рдг") рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди
@GetMapping ("/ рдкрдВрдЬреАрдХрд░рдг") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред
RegistrationController @Controller public class RegistrationController { @Autowired private UserService userService; @GetMapping("/registration") public String registration(Model model) { model.addAttribute("userForm", new User()); return "registration"; } @PostMapping("/registration") public String addUser(@ModelAttribute("userForm") @Valid User userForm, BindingResult bindingResult, Model model) { if (bindingResult.hasErrors()) { return "registration"; } if (!userForm.getPassword().equals(userForm.getPasswordConfirm())){ model.addAttribute("passwordError", " "); return "registration"; } if (!userService.saveUser(userForm)){ model.addAttribute("usernameError", " "); return "registration"; } return "redirect:/"; } }
рдкреГрд╖реНрда рд╕реЗ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдореЙрдбрд▓ рдХреА рдУрд░ рд░реБрдЦ рдХрд░рддреЗ рд╣реИрдВред GET рдЕрдиреБрд░реЛрдз рдореЗрдВ,
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдирдпрд╛ рдЦрд╛рд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкреГрд╖реНрда рдкрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ POST рдЕрдиреБрд░реЛрдз (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдкрд╛рд╕рд╡рд░реНрдб, рдкрд╛рд╕рд╡рд░реНрдб.рдХреЙрдордлрд░реНрдо) рдХреЗ рджреМрд░рд╛рди рдПрдХ рдмрд╛рд░ рдкрдВрдЬреАрдХрд░рдг рдлреЙрд░реНрдо рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рднрд░рд╛ рд╣реБрдЖ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝рд╛рд░реНрдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
AddUser () рд╡рд┐рдзрд┐ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ
рдЙрдореНрдореАрдж рдХрд░рддреА рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ (userForm) рдЬреЛ GET рдЕрдиреБрд░реЛрдз рдХреЗ рджреМрд░рд╛рди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдПрдиреЛрдЯреЗрд╢рди
рд╡реИрд▓рд┐рдб рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЦреЗрддреЛрдВ рдкрд░ рд▓рдЧрд╛рдП рдЧрдП рдкреНрд░рддрд┐рдмрдВрдз рдкреВрд░реЗ рд╣реБрдП рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо 2 рд╡рд░реНрдг рд▓рдВрдмреЗ рд╣реИрдВред рдпрджрд┐ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ
рдмрд╛рдзреНрдпрдХрд╛рд░реАResult рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред
рдпрджрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреА рд╣реИ, рддреЛ рдкреГрд╖реНрда рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдПрдВред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдорд╛рди рдирд╛рдо рд╡рд╛рд▓рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ рдФрд░ рд╕рд╣реА рд╣реИ рддреЛ
saveUser () рд╡рд┐рдзрд┐ рдЧрд▓рдд рд╣реИред рдпрджрд┐ рд╕рд╣реЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкреГрд╖реНрда рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдЪ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдПрдВред
AdminControllerред рдХреЗрд╡рд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред
UserList () рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЛрдИ рдирдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреГрд╖реНрда рдкрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
AdminController @Controller public class AdminController { @Autowired private UserService userService; @GetMapping("/admin") public String userList(Model model) { model.addAttribute("allUsers", userService.allUsers()); return "admin"; } @PostMapping("/admin") public String deleteUser(@RequestParam(required = true, defaultValue = "" ) Long userId, @RequestParam(required = true, defaultValue = "" ) String action, Model model) { if (action.equals("delete")){ userService.deleteUser(userId); } return "redirect:/admin"; } @GetMapping("/admin/gt/{userId}") public String gtUser(@PathVariable("userId") Long userId, Model model) { model.addAttribute("allUsers", userService.usergtList(userId)); return "admin"; } }
DeleteUser () рд╡рд┐рдзрд┐
RequestParam рдПрдиреЛрдЯреЗрд╢рди рдЕрд░реНрдерд╛рддреН рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рд░реВрдк рд╣реЛрдЧрд╛ рдЬреЛ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - userId рдФрд░ рдХреНрд░рд┐рдпрд╛ред рдпрд╣ рд▓рд┐рдВрдХ
http: // localhost: 8080 / admin рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдЧрд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрд░реЛрдз
= 24 рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ = рд╣рдЯрд╛рдПрдВ рдЬрдм рдпрд╣ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдИрдбреА = 24 рд╡рд╛рд▓рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
URL рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк
PathVariable рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рдирд╛ рд╣реИ ред рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рд╕реЗ рд╣рдореЗрдВ URL рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЗ рдорд┐рд▓ рдЬрд╛рддреЗ рд╣реИрдВ,
getUser () рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, URL рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
http: // localhost: 8080 / admin / gt / 24 , рд╕рдВрдХреНрд░рдордг рдХреЗ рдмрд╛рдж, рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА - 24 рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧреАред
рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕WebSecurityConfigред 2
BCryptPasswordEncoder рдФрд░
AuthenticationManager рд╕реЗрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВ , рдЬреЛ рдкрд╣рд▓реЗ userService рд╡рд░реНрдЧ рдореЗрдВ рдорд┐рд▓рддреЗ рдереЗред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ () рд╡рд┐рдзрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдЗрдЯ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреА рд╣реИред
AntMatchers () рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ,
рд╣рдо рдЙрди рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреГрд╖реНрда / рдкреГрд╖реНрда рдХрд┐рд╕ рднреВрдорд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред
WebSecurityConfig @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired UserService userService; @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity .csrf() .disable() .authorizeRequests()
4.4ред рджреГрд╢реНрдп рдЬреЛрдбрд╝рдирд╛
index.jsp рд╣реЛрдо рдкреЗрдЬ, рдиреАрдЪреЗ 2 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ - рдПрдХ рдЕрддрд┐рдерд┐ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рдЕрдзрд┐рдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдПред


index.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE HTML> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link rel="stylesheet" type="text/css" href="${contextPath}/resources/css/style.css"> </head> <body> <div> <h3>${pageContext.request.userPrincipal.name}</h3> <sec:authorize access="!isAuthenticated()"> <h4><a href="/login"></a></h4> <h4><a href="/registration"></a></h4> </sec:authorize> <sec:authorize access="isAuthenticated()"> <h4><a href="/logout"></a></h4> </sec:authorize> <h4><a href="/news"> ( )</a></h4> <h4><a href="/admin"> ( )</a></h4> </div> </body> </html>
рдЕрдзрд┐рдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ (рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреЗрдЬ рд╕реЗ рд▓рд┐рдВрдХ) рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдкрд░ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕реБрд░рдХреНрд╖рд╛ рдЯреИрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ
рдЕрдзрд┐рдХреГрдд рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣реБрдБрдЪ рдкреИрд░рд╛рдореАрдЯрд░ рдХрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░реЛрд▓
hasole ('ADMIN') рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Registration.jsp рдкрдВрдЬреАрдХрд░рдг рдкреГрд╖реНрдаред

registration.jsp <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <div> <form:form method="POST" modelAttribute="userForm"> <h2></h2> <div> <form:input type="text" path="username" placeholder="Username" autofocus="true"></form:input> <form:errors path="username"></form:errors> ${usernameError} </div> <div> <form:input type="password" path="password" placeholder="Password"></form:input> </div> <div> <form:input type="password" path="passwordConfirm" placeholder="Confirm your password"></form:input> <form:errors path="password"></form:errors> ${passwordError} </div> <button type="submit"></button> </form:form> <a href="/"></a> </div> </body> </html>
рдЗрд╕ рдкреГрд╖реНрда рдкрд░, рдЯреИрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдкреНрд░рдкрддреНрд░ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреА рдорджрдж рд╕реЗ userForm рдореЙрдбрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдмрдВрдбрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдордиреЗ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ GET рдЕрдиреБрд░реЛрдз рдХреЗ рджреМрд░рд╛рди рдкреГрд╖реНрда рдореЗрдВ рдЬреЛрдбрд╝рд╛) рдФрд░ рд░реВрдкреЛрдВ:
<form:form method="POST" modelAttribute="userForm">
рдЖрдкрдХреЛ userForm рдЧреБрдгреЛрдВ рдХреЛ рдмрд╛рдЗрдВрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
<form:input type="text" path="username" placeholder="Username"></form:input>
login.jsp рд▓реЙрдЧрд┐рди рдкреЗрдЬред

login.jsp <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Log in with your account</title> </head> <body> <sec:authorize access="isAuthenticated()"> <% response.sendRedirect("/"); %> </sec:authorize> <div> <form method="POST" action="/login"> <h2> </h2> <div> <input name="username" type="text" placeholder="Username" autofocus="true"/> <input name="password" type="password" placeholder="Password"/> <button type="submit">Log In</button> <h4><a href="/registration"></a></h4> </div> </form> </div> </body> </html>
рдпрд╣ рдкреГрд╖реНрда, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдирд┐рдпрдВрддреНрд░рдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:
рдХрд╛рд░реНрд░рд╡рд╛рдИ = "/ рд▓реЙрдЧрд┐рди" рдФрд░ рдЗрдирдкреБрдЯ рдХрд╛ рдирд╛рдоред
admin.jsp рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреГрд╖реНрдаред

admin.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Log in with your account</title> <link rel="stylesheet" type="text/css" href="${contextPath}/resources/css/style.css"> </head> <body> <div> <table> <thead> <th>ID</th> <th>UserName</th> <th>Password</th> <th>Roles</th> </thead> <c:forEach items="${allUsers}" var="user"> <tr> <td>${user.id}</td> <td>${user.username}</td> <td>${user.password}</td> <td> <c:forEach items="${user.roles}" var="role">${role.name}; </c:forEach> </td> <td> <form action="${pageContext.request.contextPath}/admin" method="post"> <input type="hidden" name="userId" value="${user.id}"/> <input type="hidden" name="action" value="delete"/> <button type="submit">Delete</button> </form> </td> </tr> </c:forEach> </table> <a href="/"></a> </div> </body> </html>
news.jsp рд╕рдорд╛рдЪрд╛рд░ рдкреГрд╖реНрда рд╕реНрдерд┐рд░ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреА рдкрд╕рдВрдж рдХреА рд╕рд╛рдордЧреНрд░реАред
news.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <div> <h2> <br> .</h2> <a href="/"></a> </div> </body> </html>
5. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдирд╛
рдореБрдЦреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд░реНрдЧ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ: @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рд╡рд╕рдВрддрдирд╛рдордХ рдПрдХ рдЦрд╛рд▓реА рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ , рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреИрд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ - рдЗрд╕рдореЗрдВ 3 рдЦрд╛рд▓реА рдЯреЗрдмрд▓ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред рдЖрдкрдХреЛ t_role рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреВрдорд┐рдХрд╛рдПрдБ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:рднреВрдорд┐рдХрд╛рдПрдБ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП SQL рдХреНрд╡реЗрд░реА INSERT INTO public.t_role(id, name) VALUES (1, 'ROLE_USER'), (2, 'ROLE_ADMIN');
рдЕрдм рдЖрдк рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рднреВрдорд┐рдХрд╛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдЗрд╕ рднреВрдорд┐рдХрд╛ рдХреЛ рджреЗрддреА рд╣реИ:SQL рдХреНрд╡реЗрд░реА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рднреВрдорд┐рдХрд╛ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ INSERT INTO public.t_user_roles(user_id, roles_id) VALUES (1, 2);
рдпрджрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЕрдзрд┐рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЗ рдкреГрд╖реНрда (рддреНрд░реБрдЯрд┐ 403) рдкрд░ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ, рддреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рдПрдВред рдХреЗрд╡рд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рднреВрдорд┐рдХрд╛ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ http: // localhost: 8080 / adminрдкреГрд╖реНрда рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ ред http: // localhost: 8080 / рд╕рдорд╛рдЪрд╛рд░ рдХреЛрдИ рднреА рдкрдВрдЬреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЗрдЦреЗрдЧрд╛ред рдЖрдк рд╕рд╛рдЗрдЯ рдкрд░ рдЕрдзрд┐рдХреГрдд рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдкрдВрдЬреАрдХрд░рдг рдФрд░ рд▓реЙрдЧрд┐рди рдкреГрд╖реНрдареЛрдВ рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдирд┐рд╖реНрдХрд░реНрд╖
рдирддреАрдЬрддрди, рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдЗрдЯ рдкреГрд╖реНрдареЛрдВ рддрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣реБрдВрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрдИ рднреВрдорд┐рдХрд╛рдПрдБ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рднреА рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдкрд░, рд╣рдо рдЙрд╕реЗ рд▓реЗрдЦрдХ рдХреА рднреВрдорд┐рдХрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрд╕реЗ рд╕рд╛рдЗрдЯ рдкрд░ рдирдИ рдЦрдмрд░реЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛редрд╕реАрдПрд╕рдПрд╕ рдФрд░ рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдИ рдЧрдИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХреА рдЧрдИред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЖрдк рдбрд┐рдЬрд╝рд╛рдЗрди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдФрд░ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛редрддреИрдпрд╛рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВредрд╕реВрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛
- рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ, рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ JPA, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ, MySQL, JSP, рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдФрд░ рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХрд░рдг рдФрд░ рд▓реЙрдЧрд┐рди
- рд╡рд╕рдВрдд рдХрд╛ рджреВрд╕рд░рд╛ рдкрд╣рд▓реВ
- рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕реБрд░рдХреНрд╖рд╛ / рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕реБрд░рдХреНрд╖рд╛ рддрдХрдиреАрдХреА рд╕рдореАрдХреНрд╖рд╛
- Spring
- : Spring 3 MVC + Spring Security + Hibernate