{"id":232,"date":"2022-11-19T16:44:42","date_gmt":"2022-11-19T16:44:42","guid":{"rendered":"https:\/\/valerio.nu\/?p=232"},"modified":"2022-11-19T16:44:42","modified_gmt":"2022-11-19T16:44:42","slug":"understand-spring-boot-security-simple-user-registration","status":"publish","type":"post","link":"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/","title":{"rendered":"Understand Spring Boot Security &#8211; Simple User Registration"},"content":{"rendered":"\n<p>This tutorial will implement Spring Security using a simple user registration form. This tutorial, which is the first of many under Spring Security, provides a beginner&#8217;s guide to learning Spring Boot. As always, our <a href=\"https:\/\/github.com\/valerio-nu\">GitHub page <\/a>has all code for our tutorials.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Setting up our project<\/strong><\/h2>\n\n\n\n<p>The maven repository was used to manage dependencies in this project. Our pom.xml file will house every dependency including the Java version used. In this example, Java 11 was used alongside Spring Boot version 2.6.2 and other dependencies such as Thymeleaf for our front-end display. Below is our pom.xml file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> &lt;properties&gt;\n        &lt;java.version&gt;11&lt;\/java.version&gt;\n    &lt;\/properties&gt;\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-security&lt;\/artifactId&gt;\n\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.thymeleaf.extras&lt;\/groupId&gt;\n            &lt;artifactId&gt;thymeleaf-extras-springsecurity5&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n\n        &lt;dependency&gt;\n            &lt;groupId&gt;mysql&lt;\/groupId&gt;\n            &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\n            &lt;scope&gt;runtime&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-devtools&lt;\/artifactId&gt;\n            &lt;scope&gt;runtime&lt;\/scope&gt;\n            &lt;optional&gt;true&lt;\/optional&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.security&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-security-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-autoconfigure&lt;\/artifactId&gt;\n            &lt;version&gt;2.6.2&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;javax.xml.bind&lt;\/groupId&gt;\n            &lt;artifactId&gt;jaxb-api&lt;\/artifactId&gt;\n            &lt;version&gt;2.3.0&lt;\/version&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>User Model<\/strong><\/h2>\n\n\n\n<p>Hibernate was used to manage our database processes using the JPA feature supported by Spring Boot. Furthermore, user information needed were the Surname, Email, Password, Firstname, Other names, and Lastname. Then, handling the persistence of data, hibernate was applied with its configuration as shown below and saved in application.properties<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spring.jpa.hibernate.ddl-auto=update\nspring.datasource.url=jdbc:mysql:\/\/localhost:3306\/simpleUserDB\nspring.datasource.username=root\nspring.datasource.password=\nspring.jpa.properties.hibernate.format_sql=true<\/code><\/pre>\n\n\n\n<p>User model code structure<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import javax.persistence.*;\n\n@Entity\n@Table(name = \"users\")\npublic class User {\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n\n    @Column(nullable = false, unique = true, length = 30)\n    private String email;\n\n    @Column(nullable = false, length = 80)\n    private String password;\n\n    @Column(name = \"first_name\", nullable = false, length = 40)\n    private String firstName;\n\n    @Column(name = \"other_names\", nullable = true, length = 40)\n    private String otherNames;\n\n    @Column(name = \"last_name\", nullable = false, length = 60)\n    private String lastName;\n\n    public User() {\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    public String getFirstName() {\n        return firstName;\n    }\n\n    public void setFirstName(String firstName) {\n        this.firstName = firstName;\n    }\n\n    public String getOtherNames() {\n        return otherNames;\n    }\n\n    public void setOtherNames(String otherNames) {\n        this.otherNames = otherNames;\n    }\n\n    public String getLastName() {\n        return lastName;\n    }\n\n    public void setLastName(String lastName) {\n        this.lastName = lastName;\n    }\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Registration Page<\/strong><\/h2>\n\n\n\n<p>This registration page collects user information such as surname, first name, last name, other names, email, and password.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;div class=\"container\"&gt;\n  &lt;div&gt;\n    &lt;h1&gt;User Registration form&lt;\/h1&gt;\n  &lt;\/div&gt;\n  &lt;form th:action=\"@{\/register_action}\" th:object=\"${user}\"\n        method=\"post\"&gt;\n    &lt;div class=\"m-3\"&gt;\n      &lt;div class=\"form-group row\"&gt;\n        &lt;label class=\"col-4 col-form-label\"&gt;User Email: &lt;\/label&gt;\n        &lt;div class=\"col-8\"&gt;\n          &lt;input type=\"email\" th:field=\"*{email}\" class=\"form-control\" required \/&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n\n      &lt;div class=\"form-group row\"&gt;\n        &lt;label class=\"col-4 col-form-label\"&gt;Password: &lt;\/label&gt;\n        &lt;div class=\"col-8\"&gt;\n          &lt;input type=\"password\" th:field=\"*{password}\" class=\"form-control\"\n                 required minlength=\"6\" maxlength=\"60\"\/&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n\n      &lt;div class=\"form-group row\"&gt;\n        &lt;label class=\"col-4 col-form-label\"&gt;First Name: &lt;\/label&gt;\n        &lt;div class=\"col-8\"&gt;\n          &lt;input type=\"text\" th:field=\"*{firstName}\" class=\"form-control\"\n                 required minlength=\"4\" maxlength=\"40\"\/&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n      &lt;div class=\"form-group row\"&gt;\n        &lt;label class=\"col-4 col-form-label\"&gt;Other Name: &lt;\/label&gt;\n        &lt;div class=\"col-8\"&gt;\n          &lt;input type=\"text\" th:field=\"*{otherNames}\" class=\"form-control\"\n                 required minlength=\"4\" maxlength=\"40\"\/&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n\n      &lt;div class=\"form-group row\"&gt;\n        &lt;label class=\"col-4 col-form-label\"&gt;Last Name: &lt;\/label&gt;\n        &lt;div class=\"col-8\"&gt;\n          &lt;input type=\"text\" th:field=\"*{lastName}\" class=\"form-control\"\n                 required minlength=\"4\" maxlength=\"60\" \/&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n\n      &lt;div&gt;\n        &lt;button type=\"submit\" class=\"btn btn-primary\"&gt;Register&lt;\/button&gt;\n      &lt;\/div&gt;\n    &lt;\/div&gt;\n  &lt;\/form&gt;\n&lt;\/div&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Login Page<\/strong><\/h2>\n\n\n\n<p>The login page we used in this program enables access using our spring security feature. Ensuring that only registered users can access the application homepage, spring security was configured to grant access to registered and authorized users.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>User\u00a0Repository Interface<\/strong><\/h2>\n\n\n\n<p><a href=\"https:\/\/spring.io\/projects\/spring-data-jpa\">Spring Data Jpa<\/a> provides a way to manage the data access layer of an application. Over the years, developing spring applications has been cumbersome. Using this data access manager enhances application performance. It is important to add that a custom access interface can also be written but in our case, we are sticking to the interface provided by Spring Data JPA.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.valerio.user_registration.models.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.data.jpa.repository.Query;\n\npublic interface UserRepo extends JpaRepository&lt;User, Long&gt; {\n    @Query(\"SELECT u FROM User u WHERE u.email = ?1\")\n    User findByEmail(String username);\n\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>User Controller<\/strong><\/h2>\n\n\n\n<p>We have to add our controller to process all requests.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.valerio.user_registration.dao.UserRepo;\nimport com.valerio.user_registration.models.User;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\n\n@Controller\npublic class UserController {\n\n\n    @Autowired\n    private UserRepo userRepo;\n\n    @GetMapping(\"\")\n    public String HomePage(){\n        return \"index\";\n    }\n\n    @GetMapping(\"\/users\")\n    public String UserPage(){\n        return \"users\";\n    }\n\n    @GetMapping(\"\/register\")\n    public String RegistrationForm(Model model) {\n        model.addAttribute(\"user\", new User());\n\n        return \"register\";\n    }\n\n    @PostMapping(\"\/register_action\")\n    public String processRegister(User user) {\n        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();\n        String encodedPassword = passwordEncoder.encode(user.getPassword());\n        user.setPassword(encodedPassword);\n\n        userRepo.save(user);\n\n        return \"success\";\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Implementing Spring Security<\/strong><\/h2>\n\n\n\n<p>To implement spring security in our application, add CustomUserDetailsService class which implements UserDetailsService<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class CustomUserDetailsService implements UserDetailsService {\n\n    @Autowired\n    private UserRepo userRepo;\n\n    @Override\n    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {\n        User user = userRepo.findByEmail(username);\n        if(user == null) {\n            throw new UsernameNotFoundException(\"This user is not available\");\n        }\n        return new CustomUserDetails(user);\n\n    }\n}<\/code><\/pre>\n\n\n\n<p>Furthermore, to activate the Spring Security features we need to create the Web security configure adapter. Then, create a class that extends&nbsp; WebSecurityConfigurerAdapter to enable all methods associated with this step. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import javax.sql.DataSource;\n\n\n@Configuration\n@EnableWebSecurity\npublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {\n    @Autowired\n    private DataSource dataSource;\n\n    @Bean\n    public UserDetailsService userDetailsService() {\n        return new CustomUserDetailsService();\n    }\n\n    @Bean\n    public BCryptPasswordEncoder passwordEncoder() {\n        return new BCryptPasswordEncoder();\n    }\n\n    @Bean\n    public DaoAuthenticationProvider authenticationProvider() {\n        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();\n        authProvider.setUserDetailsService(userDetailsService());\n        authProvider.setPasswordEncoder(passwordEncoder());\n\n        return authProvider;\n    }\n\n    @Override\n    protected void configure(AuthenticationManagerBuilder auth) throws Exception {\n        auth.authenticationProvider(authenticationProvider());\n    }\n\n    @Override\n    protected void configure(HttpSecurity http) throws Exception {\n        http.authorizeRequests()\n                .antMatchers(\"\/users\").authenticated()\n                .anyRequest().permitAll()\n                .and()\n                .formLogin()\n                .usernameParameter(\"email\")\n                .defaultSuccessUrl(\"\/users\")\n                .permitAll()\n                .and()\n                .logout().logoutSuccessUrl(\"\/\").permitAll();\n    }\n\n}<\/code><\/pre>\n\n\n\n<p>Lastly, our application provided a surface-level process for Spring Security. Our source code for this tutorial is available on <a href=\"https:\/\/github.com\/valerio-nu\/spring_security_user_registration\">GitHub<\/a>. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>This tutorial will implement Spring Security using a simple user registration form. This tutorial, which is the first of many under Spring Security, provides a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,23],"tags":[],"class_list":["post-232","post","type-post","status-publish","format-standard","hentry","category-java","category-spring-security"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Understand Spring Boot Security - Simple User Registration - Andy&#039;s blog \u2935\ufe0f<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Understand Spring Boot Security - Simple User Registration - Andy&#039;s blog \u2935\ufe0f\" \/>\n<meta property=\"og:description\" content=\"This tutorial will implement Spring Security using a simple user registration form. This tutorial, which is the first of many under Spring Security, provides a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/\" \/>\n<meta property=\"og:site_name\" content=\"Andy&#039;s blog \u2935\ufe0f\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-19T16:44:42+00:00\" \/>\n<meta name=\"author\" content=\"andy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"andy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2022\\\/11\\\/19\\\/understand-spring-boot-security-simple-user-registration\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2022\\\/11\\\/19\\\/understand-spring-boot-security-simple-user-registration\\\/\"},\"author\":{\"name\":\"andy\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/#\\\/schema\\\/person\\\/da69cc3da309893b0d3bc8fcef75f128\"},\"headline\":\"Understand Spring Boot Security &#8211; Simple User Registration\",\"datePublished\":\"2022-11-19T16:44:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2022\\\/11\\\/19\\\/understand-spring-boot-security-simple-user-registration\\\/\"},\"wordCount\":363,\"commentCount\":0,\"articleSection\":[\"Java\",\"Spring Security\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2022\\\/11\\\/19\\\/understand-spring-boot-security-simple-user-registration\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2022\\\/11\\\/19\\\/understand-spring-boot-security-simple-user-registration\\\/\",\"url\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2022\\\/11\\\/19\\\/understand-spring-boot-security-simple-user-registration\\\/\",\"name\":\"Understand Spring Boot Security - Simple User Registration - Andy&#039;s blog \u2935\ufe0f\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/#website\"},\"datePublished\":\"2022-11-19T16:44:42+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/#\\\/schema\\\/person\\\/da69cc3da309893b0d3bc8fcef75f128\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2022\\\/11\\\/19\\\/understand-spring-boot-security-simple-user-registration\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2022\\\/11\\\/19\\\/understand-spring-boot-security-simple-user-registration\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/2022\\\/11\\\/19\\\/understand-spring-boot-security-simple-user-registration\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/valerio.nu\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Understand Spring Boot Security &#8211; Simple User Registration\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/#website\",\"url\":\"https:\\\/\\\/valerio.nu\\\/\",\"name\":\"Andy&#039;s blog \u2935\ufe0f\",\"description\":\"Abandon all hope, ye who enter here\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/valerio.nu\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/valerio.nu\\\/#\\\/schema\\\/person\\\/da69cc3da309893b0d3bc8fcef75f128\",\"name\":\"andy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g\",\"caption\":\"andy\"},\"sameAs\":[\"https:\\\/\\\/valerio.nu\"],\"url\":\"https:\\\/\\\/valerio.nu\\\/index.php\\\/author\\\/giuseppe\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Understand Spring Boot Security - Simple User Registration - Andy&#039;s blog \u2935\ufe0f","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/","og_locale":"en_US","og_type":"article","og_title":"Understand Spring Boot Security - Simple User Registration - Andy&#039;s blog \u2935\ufe0f","og_description":"This tutorial will implement Spring Security using a simple user registration form. This tutorial, which is the first of many under Spring Security, provides a [&hellip;]","og_url":"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/","og_site_name":"Andy&#039;s blog \u2935\ufe0f","article_published_time":"2022-11-19T16:44:42+00:00","author":"andy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"andy","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/#article","isPartOf":{"@id":"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/"},"author":{"name":"andy","@id":"https:\/\/valerio.nu\/#\/schema\/person\/da69cc3da309893b0d3bc8fcef75f128"},"headline":"Understand Spring Boot Security &#8211; Simple User Registration","datePublished":"2022-11-19T16:44:42+00:00","mainEntityOfPage":{"@id":"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/"},"wordCount":363,"commentCount":0,"articleSection":["Java","Spring Security"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/","url":"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/","name":"Understand Spring Boot Security - Simple User Registration - Andy&#039;s blog \u2935\ufe0f","isPartOf":{"@id":"https:\/\/valerio.nu\/#website"},"datePublished":"2022-11-19T16:44:42+00:00","author":{"@id":"https:\/\/valerio.nu\/#\/schema\/person\/da69cc3da309893b0d3bc8fcef75f128"},"breadcrumb":{"@id":"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/valerio.nu\/index.php\/2022\/11\/19\/understand-spring-boot-security-simple-user-registration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/valerio.nu\/"},{"@type":"ListItem","position":2,"name":"Understand Spring Boot Security &#8211; Simple User Registration"}]},{"@type":"WebSite","@id":"https:\/\/valerio.nu\/#website","url":"https:\/\/valerio.nu\/","name":"Andy&#039;s blog \u2935\ufe0f","description":"Abandon all hope, ye who enter here","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/valerio.nu\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/valerio.nu\/#\/schema\/person\/da69cc3da309893b0d3bc8fcef75f128","name":"andy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4852a025c6250c852814d4017f646677730a23c1ec14eb5ca36b69dcce5135a5?s=96&d=mm&r=g","caption":"andy"},"sameAs":["https:\/\/valerio.nu"],"url":"https:\/\/valerio.nu\/index.php\/author\/giuseppe\/"}]}},"_links":{"self":[{"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/posts\/232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/comments?post=232"}],"version-history":[{"count":9,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/posts\/232\/revisions"}],"predecessor-version":[{"id":242,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/posts\/232\/revisions\/242"}],"wp:attachment":[{"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/media?parent=232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/categories?post=232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/valerio.nu\/index.php\/wp-json\/wp\/v2\/tags?post=232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}