{"id":768,"date":"2018-01-19T04:47:06","date_gmt":"2018-01-19T01:47:06","guid":{"rendered":"http:\/\/leodev.ru\/blog\/?p=768"},"modified":"2018-08-09T13:03:03","modified_gmt":"2018-08-09T10:03:03","slug":"spring-boot-spring-security-thymeleaf-example","status":"publish","type":"post","link":"https:\/\/leodev.ru\/blog\/spring-security\/spring-boot-spring-security-thymeleaf-example\/","title":{"rendered":"\u041f\u0440\u0438\u043c\u0435\u0440 Spring Boot + Spring Security + Thymeleaf"},"content":{"rendered":"<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u043d\u0430\u0448 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0440\u043e\u043a\u00a0<a href=\"http:\/\/leodev.ru\/blog\/spring-boot\/spring-boot-\u0438-thymeleaf-jar\/\">Spring Boot \u0438 Thymeleaf JAR<\/a>\u00a0\u0434\u043e\u0431\u0430\u0432\u0438\u0432 Spring Sequrity.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u00a0<strong>SPRING BOOT + SPRING SECURITY<\/strong>\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u00a0\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\u00a0<strong>Tomcat<\/strong>\u00a0 \u0438 \u0434\u0432\u0438\u0436\u043a\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\u00a0<strong>Thymeleaf\u00a0<\/strong>\u00a0\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e\u00a0<strong>JAR<\/strong>-\u0444\u0430\u0439\u043b\u0430.<\/p>\n<h5>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438:<\/h5>\n<ol>\n<li>Spring Boot 1.5.9.RELEASE<\/li>\n<li>Spring 4.3.13.RELEASE<\/li>\n<li>Spring Security 4.2.2<\/li>\n<li>Thymeleaf 2.1.5.RELEASE<\/li>\n<li>Thymeleaf extras Spring Security4 2.1.3<\/li>\n<li>Tomcat Embed 8.5.14<\/li>\n<li>Maven 3<\/li>\n<li>Java 8<\/li>\n<\/ol>\n<p><!--more--><\/p>\n<h2>1. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432<\/h2>\n<p><a href=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/e089a-clip-38kb1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-786\" src=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/e089a-clip-38kb1.png\" alt=\"\" width=\"494\" height=\"702\" srcset=\"https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/e089a-clip-38kb1.png 494w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/e089a-clip-38kb1-211x300.png 211w\" sizes=\"auto, (max-width: 494px) 85vw, 494px\" \/><\/a><\/p>\n<h2>2. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h2>\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u00a0<strong><span style=\"color: #993366;\">spring-boot-starter-security<\/span><\/strong>, \u043e\u043d\u0430 \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f <strong>Spring Boot + Spring Security<\/strong>\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u042f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u00a0<strong>Spring Initializr<\/strong><\/p>\n<figure id=\"attachment_770\" aria-describedby=\"caption-attachment-770\" style=\"width: 274px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/spring-boot-security.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-770\" src=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/spring-boot-security.png\" alt=\"spring boot security\" width=\"274\" height=\"302\" srcset=\"https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/spring-boot-security.png 274w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/spring-boot-security-272x300.png 272w\" sizes=\"auto, (max-width: 274px) 85vw, 274px\" \/><\/a><figcaption id=\"caption-attachment-770\" class=\"wp-caption-text\">spring boot security init<\/figcaption><\/figure>\n<pre class=\"lang:xhtml decode:true\" title=\"pom.xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\r\n\t&lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n\r\n\t&lt;groupId&gt;ru.leodev.examples.springboot&lt;\/groupId&gt;\r\n\t&lt;artifactId&gt;spring-boot-web-spring-security&lt;\/artifactId&gt;\r\n\t&lt;version&gt;0.0.1&lt;\/version&gt;\r\n\t&lt;packaging&gt;jar&lt;\/packaging&gt;\r\n\r\n\t&lt;name&gt;Spring Boot Web Spring Security&lt;\/name&gt;\r\n\t&lt;description&gt;Spring Boot Web Spring Security Example&lt;\/description&gt;\r\n\t&lt;url&gt; http:\/\/leodev.ru\/blog\/news\/spring-boot-spri\u2026hymeleaf-example\/&lt;\/url&gt;\r\n\r\n\r\n\t&lt;parent&gt;\r\n\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n\t\t&lt;artifactId&gt;spring-boot-starter-parent&lt;\/artifactId&gt;\r\n\t\t&lt;version&gt;1.5.9.RELEASE&lt;\/version&gt;\r\n\t\t&lt;relativePath\/&gt; &lt;!-- lookup parent from repository --&gt;\r\n\t&lt;\/parent&gt;\r\n\r\n\t&lt;properties&gt;\r\n\t\t&lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\r\n\t\t&lt;project.reporting.outputEncoding&gt;UTF-8&lt;\/project.reporting.outputEncoding&gt;\r\n\t\t&lt;java.version&gt;1.8&lt;\/java.version&gt;\r\n\t&lt;\/properties&gt;\r\n\r\n\t&lt;dependencies&gt;\r\n\t\t&lt;!-- Spring Security --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;spring-boot-starter-security&lt;\/artifactId&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;!-- \u043d\u0430\u0448 \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 thymeleaf \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;\/artifactId&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;!-- \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0442\u0435\u0433\u0438 \u0434\u043b\u044f SPRING SECURITY \u0432 Thymeleaf \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445 --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.thymeleaf.extras&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;thymeleaf-extras-springsecurity4&lt;\/artifactId&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;!-- \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0412\u0415\u0411 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;!-- \u0433\u043e\u0440\u044f\u0447\u0430\u044f \u043f\u043e\u0434\u043c\u0435\u043d\u0430, \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u0435\u0448 \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 live reload --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;spring-boot-devtools&lt;\/artifactId&gt;\r\n\t\t\t&lt;optional&gt;true&lt;\/optional&gt;\r\n\t\t\t&lt;scope&gt;runtime&lt;\/scope&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t\t&lt;!-- \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u043c bootstrap --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.webjars&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;bootstrap&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;3.3.7&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t&lt;\/dependencies&gt;\r\n\r\n\t&lt;build&gt;\r\n\t\t&lt;!-- \u0442\u0430\u043a \u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0436\u0435\u0441\u0442\u043a\u043e\u0435 \u0438\u043c\u044f \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f,\r\n\t\t\u0447\u0442\u043e \u0431\u044b maven \u043d\u0435 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 --&gt;\r\n\t\t&lt;finalName&gt;spring-boot-web-spring-security&lt;\/finalName&gt;\r\n\r\n\t\t&lt;plugins&gt;\r\n\t\t\t&lt;plugin&gt;\r\n\t\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n\t\t\t\t&lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\r\n\t\t\t&lt;\/plugin&gt;\r\n\t\t&lt;\/plugins&gt;\r\n\t&lt;\/build&gt;\r\n\r\n\r\n&lt;\/project&gt;<\/pre>\n<h2>3. Spring Security<\/h2>\n<p>3.1 \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442 <strong>WebSecurityConfigurerAdapter<\/strong>, \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0432\u00a0<strong>void configure(HttpSecurity http)<\/strong><\/p>\n<p><em>\u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043a\u043b\u0430\u0434\u0443 \u0432 \u043f\u0430\u043a\u0435\u0442 <strong>config, \u0432 Spring MVC\u00a0<\/strong>\u0438\u0445 \u0431\u044b\u043b\u043e \u0448\u0442\u0443\u043a\u0438 4<\/em><\/p>\n<blockquote><p><strong><span style=\"color: #993366;\">\u0414\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f &#171;admin&#187;:<\/span><\/strong><\/p>\n<p>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <strong>\/admin\u00a0<\/strong><br \/>\n\u0417\u0430\u043f\u0440\u0435\u0449\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <strong>\/user<\/strong>\u00a0, \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430 <strong>403 access denied<\/strong><\/p>\n<p><span style=\"color: #993366;\"><strong>\u0414\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f &#171;user&#187;:<\/strong><\/span><\/p>\n<p>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <strong>\/user <\/strong><\/p>\n<p>\u0417\u0430\u043f\u0440\u0435\u0449\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <strong>\/admin<\/strong>, \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430 <strong>403 access denied<\/strong><\/p><\/blockquote>\n<pre class=\"lang:java decode:true\" title=\"SpringSecurityConfig.java\">package ru.leodev.examples.springboot.springbootwebspringsecurity.config;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.context.annotation.Configuration;\r\nimport org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;\r\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\r\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\r\nimport org.springframework.security.web.access.AccessDeniedHandler;\r\n\r\n@Configuration\r\npublic class SpringSecurityConfig extends WebSecurityConfigurerAdapter {\r\n\r\n    @Autowired\r\n    private AccessDeniedHandler accessDeniedHandler;\r\n\r\n    \/\/ \u0440\u043e\u043b\u044c admin \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \/admin\/**\r\n    \/\/ \u0440\u043e\u043b\u044c user \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \/user\/**\r\n    \/\/ \u041d\u0430\u0448 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \"403 access denied\" \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\r\n    @Override\r\n    protected void configure(HttpSecurity http) throws Exception {\r\n\r\n        http.csrf().disable()\r\n                .authorizeRequests()\r\n                .antMatchers(\"\/\", \"\/index\", \"\/about\").permitAll()\r\n                .antMatchers(\"\/admin\/**\").hasAnyRole(\"ADMIN\")\r\n                .antMatchers(\"\/user\/**\").hasAnyRole(\"USER\")\r\n                .anyRequest().authenticated()\r\n                .and()\r\n                .formLogin()\r\n                .loginPage(\"\/login\")\r\n                .permitAll()\r\n                .and()\r\n                .logout()\r\n                .permitAll()\r\n                .and()\r\n                .exceptionHandling().accessDeniedHandler(accessDeniedHandler);\r\n    }\r\n\r\n    \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u043b\u0435\u043b\u0435\u0439, admin \u0438 user\r\n    @Autowired\r\n    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {\r\n\r\n        auth.inMemoryAuthentication()\r\n                .withUser(\"user\").password(\"password\").roles(\"USER\")\r\n                .and()\r\n                .withUser(\"admin\").password(\"password\").roles(\"ADMIN\");\r\n    }\r\n}\r\n<\/pre>\n<p>[stextbox id=&#8217;warning&#8217; caption=&#8217;configure(HttpSecurity)&#8217; collapsing=&#187;true&#187;]<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434\u00a0configure(HttpSecurity)\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 URL \u043f\u0443\u0442\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043d\u0435\u0442. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, &#171;\/&#187; \u0438 &#171;\/home&#187; \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0431\u0435\u0437 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u041a\u043e \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0443\u0442\u044f\u043c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u043e\u0439\u0434\u0435\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0443\u044e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>[\/stextbox]<\/p>\n<p>[stextbox id=&#8217;warning&#8217; caption=&#8217;configure(AuthenticationManagerBuilder)&#8217; collapsing=&#187;true&#187;]\u043c\u0435\u0442\u043e\u0434 configure(AuthenticationManagerBuilder), \u0442\u043e \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0445 2 user \u0438 admin[\/stextbox]<\/p>\n<p>3.2 \u041d\u0430\u0448 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 <strong>403 Access denied<\/strong> \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430 <strong>\/403<\/strong><\/p>\n<pre class=\"lang:java decode:true\" title=\"MyAccessDeniedHandler.class\">package ru.leodev.examples.springboot.springbootwebspringsecurity.controller;\r\n\r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\nimport org.springframework.security.access.AccessDeniedException;\r\nimport org.springframework.security.core.Authentication;\r\nimport org.springframework.security.core.context.SecurityContextHolder;\r\nimport org.springframework.security.web.access.AccessDeniedHandler;\r\nimport org.springframework.stereotype.Component;\r\n\r\nimport javax.servlet.ServletException;\r\nimport javax.servlet.http.HttpServletRequest;\r\nimport javax.servlet.http.HttpServletResponse;\r\nimport java.io.IOException;\r\n\r\n\/**\r\n * \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 403 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430 \/403 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\r\n *\/\r\n\r\n@Component\r\npublic class MyAccessDeniedHandler implements AccessDeniedHandler {\r\n\r\n    private static Logger logger = LoggerFactory.getLogger(MyAccessDeniedHandler.class);\r\n\r\n    @Override\r\n    public void handle(HttpServletRequest httpServletRequest,\r\n                       HttpServletResponse httpServletResponse,\r\n                       AccessDeniedException e) throws IOException, ServletException {\r\n\r\n        Authentication auth = SecurityContextHolder.getContext().getAuthentication();\r\n        if (auth != null){\r\n            logger.info(\"User '\" + auth.getName() + \"' attempted to access the protected URL: \" + httpServletRequest.getRequestURI());\r\n        }\r\n        httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + \"\/403\");\r\n    }\r\n}<\/pre>\n<h2>4. Spring Boot<\/h2>\n<p>4.1 \u0414\u043e\u0431\u0430\u0432\u0438\u043c\u00a0\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0432 \u043d\u0435\u043c \u0438\u043c\u0435\u043d\u0430 \u0432\u044c\u044e\u0445 \u0438\u00a0http \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/p>\n<p>[stextbox id=&#8217;info&#8217; caption=&#8217;\u041f\u043e\u0447\u0435\u043c\u0443 @GetMapping?&#8217; collapsing=&#187;true&#187; collapsed=&#187;true&#187; shadow=&#187;false&#187;]<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <strong>@GetMapping<\/strong>, \u043f\u043e \u0441\u0443\u0442\u0438 \u043e\u043d \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d\u00a0<strong>@RequestMapping(method = RequestMethod.GET)\u00a0<\/strong>\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u0435\u043d.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0431\u044b\u0432\u0430\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b:<\/p>\n<p>@GetMapping,<\/p>\n<p>@PostMapping,<\/p>\n<p>@PutMapping,<\/p>\n<p>@DeleteMapping,<\/p>\n<p>@PatchMapping<\/p>\n<p>[\/stextbox]<\/p>\n<pre class=\"lang:java decode:true \" title=\"MainController.class\">package ru.leodev.examples.springboot.springbootwebspringsecurity.controller;\r\n\r\nimport org.springframework.stereotype.Controller;\r\nimport org.springframework.web.bind.annotation.GetMapping;\r\n\r\n@Controller\r\npublic class MainController {\r\n\r\n    \/\/\u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 2 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u043d\u0435\u0442.\r\n    \/\/ \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \"\/\" \u0438 \"\/index\"\r\n    @GetMapping(value = {\"\/\", \"\/index\"})\r\n    public String index() {\r\n        return \"\/index\";\r\n    }\r\n\r\n    @GetMapping(\"\/admin\")\r\n    public String admin() {\r\n        return \"\/admin\";\r\n    }\r\n\r\n    @GetMapping(\"\/user\")\r\n    public String user() {\r\n        return \"\/user\";\r\n    }\r\n\r\n    @GetMapping(\"\/about\")\r\n    public String about() {\r\n        return \"\/about\";\r\n    }\r\n\r\n    @GetMapping(\"\/login\")\r\n    public String login() {\r\n        return \"\/login\";\r\n    }\r\n\r\n    @GetMapping(\"\/403\")\r\n    public String error403() {\r\n        return \"\/error\/403\";\r\n    }\r\n}\r\n<\/pre>\n<p>4.2 \u041d\u0430\u0448\u0430 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 &#8212; \u0441\u0430\u043c Spring Boot application, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0440\u0443\u0447\u043d\u0443\u044e<\/p>\n<pre class=\"lang:java decode:true \" title=\"SpringBootWebSpringSecurityApplication.class\">package ru.leodev.examples.springboot.springbootwebspringsecurity;\r\n\r\nimport org.springframework.boot.SpringApplication;\r\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\r\n\r\n@SpringBootApplication\r\npublic class SpringBootWebSpringSecurityApplication {\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\tSpringApplication.run(SpringBootWebSpringSecurityApplication.class, args);\r\n\t}\r\n}\r\n<\/pre>\n<h2>5. Thymeleaf + Resources + \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b<\/h2>\n<p>5.1\u00a0\u0414\u043b\u044f <strong>Thymeleaf<\/strong> \u0444\u0430\u0439\u043b\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0432\u00a0<strong>src\/main\/resources\/templates\/<\/strong><\/p>\n<p>5.2 Thymeleaf \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b, \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u2013 <strong>header<\/strong><\/p>\n<pre class=\"lang:java decode:true\" title=\"header.html\">&lt;html xmlns:th=\"http:\/\/www.thymeleaf.org\"&gt;\r\n&lt;head&gt;\r\n    &lt;div th:fragment=\"header-css\"&gt;\r\n        &lt;!-- this is header-css --&gt;\r\n        &lt;link rel=\"stylesheet\" type=\"text\/css\" href=\"webjars\/bootstrap\/3.3.7\/css\/bootstrap.min.css\" \/&gt;\r\n        &lt;link rel=\"stylesheet\" th:href=\"@{\/css\/main.css}\" href=\"..\/..\/css\/main.css\" \/&gt;\r\n    &lt;\/div&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n&lt;div th:fragment=\"header\"&gt;\r\n    &lt;!-- this is header --&gt;\r\n    &lt;nav class=\"navbar navbar-inverse\"&gt;\r\n        &lt;div class=\"container\"&gt;\r\n            &lt;div class=\"navbar-header\"&gt;\r\n                &lt;a class=\"navbar-brand\" th:href=\"@{\/}\"&gt;Spring Boot&lt;\/a&gt;\r\n            &lt;\/div&gt;\r\n            &lt;div id=\"navbar\" class=\"collapse navbar-collapse\"&gt;\r\n                &lt;ul class=\"nav navbar-nav\"&gt;\r\n                    &lt;li class=\"active\"&gt;&lt;a th:href=\"@{\/}\"&gt;Home&lt;\/a&gt;&lt;\/li&gt;\r\n                &lt;\/ul&gt;\r\n            &lt;\/div&gt;\r\n        &lt;\/div&gt;\r\n    &lt;\/nav&gt;\r\n&lt;\/div&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>5.3 Thymeleaf \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b, \u0434\u043b\u044f \u043c\u0430\u043a\u0435\u0442\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u2013 <strong>footer<\/strong>. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0435\u0433 <strong>sec<\/strong>, \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 <strong>Spring Security<\/strong> \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435\u00a0<a href=\"https:\/\/github.com\/thymeleaf\/thymeleaf-extras-springsecurity\" target=\"_blank\" rel=\"noopener\">Thymeleaf extra Spring Security<\/a><\/p>\n<pre class=\"lang:java decode:true \" title=\"footer.html\">&lt;html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"\r\n      xmlns:th=\"http:\/\/www.thymeleaf.org\"\r\n      xmlns:sec=\"http:\/\/www.thymeleaf.org\/thymeleaf-extras-springsecurity4\"&gt;\r\n&lt;head&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n&lt;div th:fragment=\"footer\"&gt;\r\n    &lt;div class=\"container\"&gt;\r\n        &lt;footer&gt;\r\n            &lt;!-- FOOTER --&gt;\r\n            &lt;!-- \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438 \u0432 pom \u043c\u044b \u043c\u043e\u0435\u0436\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\r\n            \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0433\u0438 \u0438 \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b\u0445 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\r\n            \u0412\u0410\u0416\u041d\u041e! \u0421\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430(\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a),\r\n            \u044d\u0442\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u0432\u0430\u043c \u043d\u0435\u0440\u0432\u044b(\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438, \u0444\u0438\u043b\u044c\u0442\u0440\u044b) \u0438 \u0434\u0430\u0441\u0442 \u0431\u0435\u0441\u0446\u0435\u043d\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c --&gt;\r\n            \u00a9 2018 leodev.ru\r\n            &lt;span sec:authorize=\"isAuthenticated()\"&gt;| Logged user: &lt;span sec:authentication=\"name\"&gt;&lt;\/span&gt; |\r\n                Roles: &lt;span sec:authentication=\"principal.authorities\"&gt;&lt;\/span&gt; |\r\n                &lt;a th:href=\"@{\/logout}\"&gt;Sign Out&lt;\/a&gt;\r\n            &lt;\/span&gt;\r\n            &lt;script type=\"text\/javascript\" src=\"webjars\/bootstrap\/3.3.7\/js\/bootstrap.min.js\"&gt;&lt;\/script&gt;\r\n        &lt;\/footer&gt;\r\n    &lt;\/div&gt;\r\n\r\n&lt;\/div&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>5.4 \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c Thymeleaf \u0444\u0430\u0439\u043b\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.<\/p>\n<pre class=\"lang:java decode:true\" title=\"index.html\">&lt;!DOCTYPE HTML&gt;\r\n&lt;html xmlns:th=\"http:\/\/www.thymeleaf.org\"&gt;\r\n&lt;head&gt;\r\n    &lt;title&gt;Spring Boot Thymeleaf + Spring Security&lt;\/title&gt;\r\n\r\n    &lt;div th:replace=\"fragments\/header :: header-css\"\/&gt;\r\n\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;div th:replace=\"fragments\/header :: header\"\/&gt;\r\n\r\n&lt;div class=\"container\"&gt;\r\n\r\n    &lt;div class=\"starter-template\"&gt;\r\n        &lt;h1&gt;Spring Boot Web Thymeleaf + Spring Security&lt;\/h1&gt;\r\n        &lt;h2&gt;1. \u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 &lt;a th:href=\"@{\/admin}\"&gt;\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 Admin (\u0417\u0430\u0449\u0438\u0449\u0435\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0448\u044c\u044e Spring Security, \u043d\u0443\u0436\u043d\u044b \u043f\u0440\u0430\u0432\u0430 \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430(Admin Role))&lt;\/a&gt;&lt;\/h2&gt;\r\n        &lt;h2&gt;2. \u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 &lt;a th:href=\"@{\/user}\"&gt;\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 User (\u0417\u0430\u0449\u0438\u0449\u0435\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0448\u044c\u044e Spring Security, \u043d\u0443\u0436\u043d\u044b \u043f\u0440\u0430\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f(User Role))&lt;\/a&gt;&lt;\/h2&gt;\r\n        &lt;h2&gt;3. \u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 &lt;a th:href=\"@{\/about}\"&gt;\u041e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443(\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432\u0441\u0435\u043c)&lt;\/a&gt;&lt;\/h2&gt;\r\n    &lt;\/div&gt;\r\n\r\n&lt;\/div&gt;\r\n&lt;!-- \/.container --&gt;\r\n\r\n&lt;div th:replace=\"fragments\/footer :: footer\"\/&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<pre class=\"lang:java decode:true\" title=\"admin.html\">&lt;!DOCTYPE HTML&gt;\r\n&lt;html xmlns:th=\"http:\/\/www.thymeleaf.org\"&gt;\r\n&lt;head&gt;\r\n    &lt;div th:replace=\"fragments\/header :: header-css\"\/&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;div th:replace=\"fragments\/header :: header\"\/&gt;\r\n&lt;div class=\"container\"&gt;\r\n\r\n    &lt;div class=\"starter-template\"&gt;\r\n        &lt;h1&gt;Admin page (Spring Security protected)&lt;\/h1&gt;\r\n        &lt;h1 th:inline=\"text\"&gt;Hello [[${#httpServletRequest.remoteUser}]]!&lt;\/h1&gt;\r\n        &lt;form th:action=\"@{\/logout}\" method=\"post\"&gt;\r\n            &lt;input type=\"submit\" value=\"Sign Out\"\/&gt;\r\n        &lt;\/form&gt;\r\n\r\n    &lt;\/div&gt;\r\n\r\n&lt;\/div&gt;\r\n&lt;!-- \/.container --&gt;\r\n\r\n&lt;div th:replace=\"fragments\/footer :: footer\"\/&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"lang:java decode:true\" title=\"user.html\">&lt;!DOCTYPE HTML&gt;\r\n&lt;html xmlns:th=\"http:\/\/www.thymeleaf.org\"&gt;\r\n&lt;head&gt;\r\n    &lt;div th:replace=\"fragments\/header :: header-css\"\/&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n&lt;div th:replace=\"fragments\/header :: header\"\/&gt;\r\n\r\n&lt;div class=\"container\"&gt;\r\n\r\n    &lt;div class=\"starter-template\"&gt;\r\n        &lt;h1&gt;User page (Spring Security protected)&lt;\/h1&gt;\r\n        &lt;h1 th:inline=\"text\"&gt;Hello [[${#httpServletRequest.remoteUser}]]!&lt;\/h1&gt;\r\n        &lt;form th:action=\"@{\/logout}\" method=\"post\"&gt;\r\n            &lt;input type=\"submit\" value=\"Sign Out\"\/&gt;\r\n        &lt;\/form&gt;\r\n    &lt;\/div&gt;\r\n\r\n&lt;\/div&gt;\r\n&lt;!-- \/.container --&gt;\r\n&lt;div th:replace=\"fragments\/footer :: footer\"\/&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<pre class=\"lang:java decode:true\" title=\"about.html\">&lt;!DOCTYPE HTML&gt;\r\n&lt;html xmlns:th=\"http:\/\/www.thymeleaf.org\"&gt;\r\n&lt;head&gt;\r\n    &lt;div th:replace=\"fragments\/header :: header-css\"\/&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;div th:replace=\"fragments\/header :: header\"\/&gt;\r\n\r\n&lt;div class=\"container\"&gt;\r\n\r\n    &lt;div class=\"starter-template\"&gt;\r\n        &lt;h1&gt;Normal page (No need login)&lt;\/h1&gt;\r\n    &lt;\/div&gt;\r\n\r\n&lt;\/div&gt;\r\n&lt;!-- \/.container --&gt;\r\n\r\n&lt;div th:replace=\"fragments\/footer :: footer\"\/&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<pre class=\"lang:java decode:true\" title=\"login.html\">&lt;!DOCTYPE html&gt;\r\n&lt;html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" xmlns:th=\"http:\/\/www.thymeleaf.org\"\r\n&gt;\r\n&lt;head&gt;\r\n    &lt;title&gt;Spring Security Example &lt;\/title&gt;\r\n    &lt;div th:replace=\"fragments\/header :: header-css\"\/&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;div th:replace=\"fragments\/header :: header\"\/&gt;\r\n\r\n&lt;div class=\"container\"&gt;\r\n\r\n    &lt;div class=\"row\" style=\"margin-top:20px\"&gt;\r\n        &lt;div class=\"col-xs-12 col-sm-8 col-md-6 col-sm-offset-2 col-md-offset-3\"&gt;\r\n            &lt;form th:action=\"@{\/login}\" method=\"post\"&gt;\r\n                &lt;fieldset&gt;\r\n                    &lt;h1&gt;Please Sign In&lt;\/h1&gt;\r\n\r\n                    &lt;div th:if=\"${param.error}\"&gt;\r\n                        &lt;div class=\"alert alert-danger\"&gt;\r\n                            Invalid username and password.\r\n                        &lt;\/div&gt;\r\n                    &lt;\/div&gt;\r\n                    &lt;div th:if=\"${param.logout}\"&gt;\r\n                        &lt;div class=\"alert alert-info\"&gt;\r\n                            You have been logged out.\r\n                        &lt;\/div&gt;\r\n                    &lt;\/div&gt;\r\n\r\n                    &lt;div class=\"form-group\"&gt;\r\n                        &lt;input type=\"text\" name=\"username\" id=\"username\" class=\"form-control input-lg\"\r\n                               placeholder=\"UserName\" required=\"true\" autofocus=\"true\"\/&gt;\r\n                    &lt;\/div&gt;\r\n                    &lt;div class=\"form-group\"&gt;\r\n                        &lt;input type=\"password\" name=\"password\" id=\"password\" class=\"form-control input-lg\"\r\n                               placeholder=\"Password\" required=\"true\"\/&gt;\r\n                    &lt;\/div&gt;\r\n\r\n                    &lt;div class=\"row\"&gt;\r\n                        &lt;div class=\"col-xs-6 col-sm-6 col-md-6\"&gt;\r\n                            &lt;input type=\"submit\" class=\"btn btn-lg btn-primary btn-block\" value=\"Sign In\"\/&gt;\r\n                        &lt;\/div&gt;\r\n                        &lt;div class=\"col-xs-6 col-sm-6 col-md-6\"&gt;\r\n                        &lt;\/div&gt;\r\n                    &lt;\/div&gt;\r\n                &lt;\/fieldset&gt;\r\n            &lt;\/form&gt;\r\n        &lt;\/div&gt;\r\n    &lt;\/div&gt;\r\n\r\n&lt;\/div&gt;\r\n\r\n&lt;div th:replace=\"fragments\/footer :: footer\"\/&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<pre class=\"lang:java decode:true\" title=\"src\/main\/resources\/templates\/error\/403.html\">&lt;!DOCTYPE HTML&gt;\r\n&lt;html xmlns:th=\"http:\/\/www.thymeleaf.org\"&gt;\r\n&lt;head&gt;\r\n    &lt;div th:replace=\"fragments\/header :: header-css\"\/&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;div th:replace=\"fragments\/header :: header\"\/&gt;\r\n\r\n&lt;div class=\"container\"&gt;\r\n\r\n    &lt;div class=\"starter-template\"&gt;\r\n        &lt;h1&gt;403 - Access is denied&lt;\/h1&gt;\r\n        &lt;div th:inline=\"text\"&gt;Hello '[[${#httpServletRequest.remoteUser}]]',\r\n                you do not have permission to access this page.&lt;\/div&gt;\r\n    &lt;\/div&gt;\r\n\r\n&lt;\/div&gt;\r\n&lt;!-- \/.container --&gt;\r\n\r\n&lt;div th:replace=\"fragments\/footer :: footer\"\/&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>4.2\u00a0\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0441\u0442\u0438\u043b\u0438\u00a0<strong>CSS<\/strong>\u00a0\u0438\u043b\u0438\u00a0<strong>Javascript\u00a0<\/strong>\u043a\u043b\u0430\u0434\u0435\u043c \u0432\u00a0<strong>\/src\/main\/resources\/static\/<\/strong><\/p>\n<pre class=\"lang:java decode:true \" title=\"main.css\">h1{\r\n    color: #4a2bff;\r\n}\r\n\r\nh2{\r\n    color: #ff171c;\r\n}\r\n\r\nfooter{\r\n    margin-top:60px;\r\n}<\/pre>\n<p>[stextbox id=&#8217;black&#8217;]\u041f\u0440\u043e\u0447\u0442\u0438\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043e\u00a0<a href=\"http:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/htmlsingle\/#boot-features-spring-mvc-static-content\">Spring Boot Serving static content<\/a>\u00a0\u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u0432\u00a0<strong>Spring<\/strong>[\/stextbox]<\/p>\n<h2>6. \u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>6.1 \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u0443\u0442\u044c\u00a0<code>\/admin\/**<\/code>\u00a0\u0437\u0430\u0449\u0438\u0449\u0435\u043d ,\u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u0439\u0442\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u0430\u043a \u0430\u0434\u043c\u0438\u043d \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f<\/p>\n<pre class=\"lang:java decode:true \">mvn spring-boot:run<\/pre>\n<p>6.2 \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u00a0<strong>http:\/\/localhost:8080<\/strong><\/p>\n<p><a href=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/3afa8-clip-100kb1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-776\" src=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/3afa8-clip-100kb1.png\" alt=\"\" width=\"1051\" height=\"571\" srcset=\"https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/3afa8-clip-100kb1.png 1051w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/3afa8-clip-100kb1-300x163.png 300w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/3afa8-clip-100kb1-768x417.png 768w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/3afa8-clip-100kb1-1024x556.png 1024w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<p>6.3 \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a <strong>http:\/\/localhost:8080\/admin<\/strong>, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0441 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 <strong>http:\/\/localhost:8080\/login<\/strong><\/p>\n<p><a href=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/21409-clip-49kb1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-777\" src=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/21409-clip-49kb1.png\" alt=\"\" width=\"1050\" height=\"565\" srcset=\"https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/21409-clip-49kb1.png 1050w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/21409-clip-49kb1-300x161.png 300w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/21409-clip-49kb1-768x413.png 768w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/21409-clip-49kb1-1024x551.png 1024w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<p>6.4 \u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043d \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0442\u0430\u043a \u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u0438\u044f\u00a0<strong>http:\/\/localhost:8080\/login<\/strong><\/p>\n<p><a href=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/09d2b-clip-52kb1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-778\" src=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/09d2b-clip-52kb1.png\" alt=\"\" width=\"1051\" height=\"572\" srcset=\"https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/09d2b-clip-52kb1.png 1051w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/09d2b-clip-52kb1-300x163.png 300w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/09d2b-clip-52kb1-768x418.png 768w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/09d2b-clip-52kb1-1024x557.png 1024w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<p>6.5 \u041f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0410\u0434\u043c\u0438\u043d\u0430 <strong>http:\/\/localhost:8080\/admin<\/strong>, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043e\u0442 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 <strong>header<\/strong> \u0438 <strong>footer<\/strong>\u00a0\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u043c thymeleaf<\/p>\n<p><a href=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/a11e0-clip-55kb1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-779\" src=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/a11e0-clip-55kb1.png\" alt=\"\" width=\"781\" height=\"443\" srcset=\"https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/a11e0-clip-55kb1.png 781w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/a11e0-clip-55kb1-300x170.png 300w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/a11e0-clip-55kb1-768x436.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/a><\/p>\n<p>6.6 \u0410 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0<strong>http:\/\/localhost:8080\/user<\/strong>, \u043f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0442 \u043d\u0430\u0441 \u043d\u0430 403 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\u00a0<strong>http:\/\/localhost:8080\/403 <\/strong>\u043a\u0430\u043a \u043c\u044b \u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Spring Security<\/p>\n<p><a href=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/9e01b-clip-47kb1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-780\" src=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/9e01b-clip-47kb1.png\" alt=\"\" width=\"781\" height=\"442\" srcset=\"https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/9e01b-clip-47kb1.png 781w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/9e01b-clip-47kb1-300x170.png 300w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/9e01b-clip-47kb1-768x435.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/a><\/p>\n<p>6.7 \u041a\u043b\u0438\u043a\u043d\u0443\u0432 \u0432 \u043d\u0438\u0437\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043d\u0430 \u0441\u0441\u044b\u043b\u043a\u0443 sign out(\u0432\u044b\u0445\u043e\u0434), \u043d\u0430\u0441 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u00a0<strong>http:\/\/localhost:8080\/login?logout<\/strong><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0438 \u0437\u0434\u0435\u0441\u044c S<strong>pring S<\/strong><strong>ecurity<\/strong> \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0441\u044f \u043e \u043d\u0430\u0441 \ud83d\ude09<\/p>\n<p><a href=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/1d252-clip-52kb1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-781\" src=\"http:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/1d252-clip-52kb1.png\" alt=\"\" width=\"857\" height=\"597\" srcset=\"https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/1d252-clip-52kb1.png 857w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/1d252-clip-52kb1-300x209.png 300w, https:\/\/leodev.ru\/blog\/wp-content\/uploads\/2018\/01\/1d252-clip-52kb1-768x535.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<h2>\u0421\u0441\u044b\u043b\u043a\u0438<\/h2>\n<ol>\n<li><a href=\"http:\/\/www.mkyong.com\/spring-boot\/spring-boot-spring-security-thymeleaf-example\/\">http:\/\/www.mkyong.com\/<\/a><\/li>\n<li><a href=\"https:\/\/spring.io\/guides\/gs\/securing-web\/\" target=\"_blank\" rel=\"noopener\">Securing a Web Application<\/a><\/li>\n<li><a href=\"https:\/\/docs.spring.io\/spring-security\/site\/docs\/current\/reference\/htmlsingle\/\" target=\"_blank\" rel=\"noopener\">Spring Security Reference<\/a><\/li>\n<li><a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/htmlsingle\/#boot-features-security\" target=\"_blank\" rel=\"noopener\">Spring Boot Security features<\/a><\/li>\n<li><a href=\"http:\/\/www.mkyong.com\/spring-boot\/spring-boot-hello-world-example-thymeleaf\/\" target=\"_blank\" rel=\"noopener\">Spring Boot Hello World Example \u2013 Thymeleaf<\/a><\/li>\n<li><a href=\"http:\/\/www.mkyong.com\/spring-security\/spring-security-hello-world-annotation-example\/\" target=\"_blank\" rel=\"noopener\">Spring Security Hello World Annotation Example<\/a><\/li>\n<li><a href=\"http:\/\/www.thymeleaf.org\/doc\/articles\/springsecurity.html\" target=\"_blank\" rel=\"noopener\">Thymeleaf \u2013 Spring Security integration basics<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/thymeleaf\/thymeleaf-extras-springsecurity\" target=\"_blank\" rel=\"noopener\">Thymeleaf extra \u2013 Spring Security integration basics<\/a><\/li>\n<li><a href=\"http:\/\/www.thymeleaf.org\/doc\/articles\/standardurlsyntax.html\" target=\"_blank\" rel=\"noopener\">Thymeleaf \u2013 Standard URL Syntax<\/a><\/li>\n<li><a href=\"https:\/\/medium.com\/@gustavo.ponce.ch\/spring-boot-spring-mvc-spring-security-mysql-a5d8545d837d\" target=\"_blank\" rel=\"noopener\">Spring Boot + Spring MVC + Spring Security + MySQL<\/a><\/li>\n<li><a href=\"http:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/htmlsingle\/#boot-features-spring-mvc-static-content\" target=\"_blank\" rel=\"noopener\">Spring Boot \u2013 Static content<\/a><\/li>\n<li><a href=\"https:\/\/www.mkyong.com\/spring-mvc\/spring-mvc-how-to-include-js-or-css-files-in-a-jsp-page\/\" target=\"_blank\" rel=\"noopener\">Spring MVC \u2013 Inlucde CSS file<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u043d\u0430\u0448 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0440\u043e\u043a\u00a0Spring Boot \u0438 Thymeleaf JAR\u00a0\u0434\u043e\u0431\u0430\u0432\u0438\u0432 Spring Sequrity. \u0418\u0442\u0430\u043a, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u00a0SPRING BOOT + SPRING SECURITY\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u00a0\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\u00a0Tomcat\u00a0 \u0438 \u0434\u0432\u0438\u0436\u043a\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\u00a0Thymeleaf\u00a0\u00a0\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e\u00a0JAR-\u0444\u0430\u0439\u043b\u0430. \u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438: Spring Boot 1.5.9.RELEASE Spring 4.3.13.RELEASE Spring Security 4.2.2 Thymeleaf 2.1.5.RELEASE Thymeleaf extras Spring Security4 2.1.3 Tomcat Embed 8.5.14 Maven 3 Java 8<\/p>\n","protected":false},"author":1,"featured_media":704,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[207,96],"tags":[220,217,219,221,210],"class_list":["post-768","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-spring-boot","category-spring-security","tag-security","tag-spring-boot","tag-spring-security","tag-template","tag-thymeleaf"],"_links":{"self":[{"href":"https:\/\/leodev.ru\/blog\/wp-json\/wp\/v2\/posts\/768","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/leodev.ru\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/leodev.ru\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/leodev.ru\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/leodev.ru\/blog\/wp-json\/wp\/v2\/comments?post=768"}],"version-history":[{"count":11,"href":"https:\/\/leodev.ru\/blog\/wp-json\/wp\/v2\/posts\/768\/revisions"}],"predecessor-version":[{"id":931,"href":"https:\/\/leodev.ru\/blog\/wp-json\/wp\/v2\/posts\/768\/revisions\/931"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/leodev.ru\/blog\/wp-json\/wp\/v2\/media\/704"}],"wp:attachment":[{"href":"https:\/\/leodev.ru\/blog\/wp-json\/wp\/v2\/media?parent=768"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/leodev.ru\/blog\/wp-json\/wp\/v2\/categories?post=768"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/leodev.ru\/blog\/wp-json\/wp\/v2\/tags?post=768"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}