Skip to content

Commit 8f24886

Browse files
committed
Spring Boot Security JDBC
1 parent f3e5713 commit 8f24886

23 files changed

+862
-23
lines changed

Chapter4_Securing Spring/pom.xml

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
<description>The project for Spring Boot</description>
1616

1717
<properties>
18+
<project.build.sourceEncoding>
19+
UTF-8</project.build.sourceEncoding>
20+
<project.reporting.outputEncoding>
21+
UTF-8</project.reporting.outputEncoding>
1822
<java.version>1.8</java.version>
1923
</properties>
2024

@@ -27,6 +31,12 @@
2731
<groupId>org.springframework.boot</groupId>
2832
<artifactId>spring-boot-starter-data-jpa</artifactId>
2933
</dependency>
34+
35+
<dependency>
36+
<groupId>javax.persistence</groupId>
37+
<artifactId>javax.persistence-api</artifactId>
38+
<version>2.2</version>
39+
</dependency>
3040
<dependency>
3141
<groupId>org.springframework.boot</groupId>
3242
<artifactId>spring-boot-starter-security</artifactId>
@@ -39,7 +49,22 @@
3949
<groupId>org.springframework.boot</groupId>
4050
<artifactId>spring-boot-starter-web</artifactId>
4151
</dependency>
42-
52+
<!-- https://mvnrepository.com/artifact/com.github.sebhoss/suppress-warnings -->
53+
<dependency>
54+
<groupId>com.github.sebhoss</groupId>
55+
<artifactId>suppress-warnings</artifactId>
56+
<version>2.0.0</version>
57+
</dependency>
58+
<dependency>
59+
<groupId>org.seleniumhq.selenium</groupId>
60+
<artifactId>htmlunit-driver</artifactId>
61+
<scope>test</scope>
62+
</dependency>
63+
<dependency>
64+
<groupId>com.h2database</groupId>
65+
<artifactId>h2</artifactId>
66+
<scope>runtime</scope>
67+
</dependency>
4368
<dependency>
4469
<groupId>org.springframework.boot</groupId>
4570
<artifactId>spring-boot-devtools</artifactId>
@@ -67,6 +92,17 @@
6792
</exclusion>
6893
</exclusions>
6994
</dependency>
95+
<dependency>
96+
<groupId>org.springframework.boot</groupId>
97+
<artifactId>spring-boot-starter</artifactId>
98+
</dependency>
99+
<!-- tag::springSecurity[] -->
100+
<dependency>
101+
<groupId>org.springframework.boot</groupId>
102+
<artifactId>spring-boot-starter-security</artifactId>
103+
</dependency>
104+
<!-- end::springSecurity[] -->
105+
70106
<dependency>
71107
<groupId>org.springframework.security</groupId>
72108
<artifactId>spring-security-test</artifactId>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,31 @@
11
package spring.security;
22

3+
import lombok.AccessLevel;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
import lombok.RequiredArgsConstructor;
7+
8+
import javax.persistence.Entity;
9+
import javax.persistence.Id;
10+
311
/**
412
* @Created 17 / 03 / 2020 - 6:43 PM
513
* @project BootSecure
614
* @Author Hamdamboy
715
*/
16+
17+
@Data
18+
@RequiredArgsConstructor
19+
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
20+
@Entity
821
public class Ingredient {
22+
//
23+
@Id
24+
private final String id;
25+
private final String name;
26+
private final Type type;
27+
28+
public static enum Type{
29+
WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
30+
}
931
}

Chapter4_Securing Spring/src/main/java/spring/security/Order.java

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,65 @@
55
* @project BootSecure
66
* @Author Hamdamboy
77
*/
8-
public class Order {
8+
9+
import lombok.Data;
10+
11+
import javax.persistence.*;
12+
import javax.validation.constraints.Digits;
13+
import javax.validation.constraints.NotBlank;
14+
import javax.validation.constraints.Pattern;
15+
import java.io.Serializable;
16+
import java.util.ArrayList;
17+
import java.util.Date;
18+
import java.util.List;
19+
20+
/**
21+
* @Data - is the class level is provides by Lombok and tells Lombok to generate all missing methods as well as
22+
* constructor that accepts all final properties as arguments.
23+
* **/
24+
25+
@Data
26+
@Entity
27+
@Table(name = "Taco_Order")
28+
public class Order implements Serializable {
29+
//
30+
31+
private static final long serialVersionUID = 1L;
32+
33+
@Id
34+
@GeneratedValue(strategy = GenerationType.AUTO)
35+
private Long id;
36+
37+
private Date placeAt;
38+
39+
@ManyToOne
40+
private User user;
41+
42+
@NotBlank(message="Delivery name is required")
43+
private String deliveryStreet;
44+
45+
@NotBlank(message = "City is required")
46+
private String deliveryCity;
47+
48+
@NotBlank(message = "Zip code is required")
49+
private String ccNumber;
50+
51+
@Pattern(regexp = "^(0[1-9]|1[0-2])([\\\\/])([1-9][0-9])$", message = "Must be formatted MM/YY")
52+
private String ccExpiration;
53+
54+
@Digits(integer = 3, fraction = 0, message = "Invalid CVV")
55+
private String ccCVV;
56+
57+
@ManyToMany(targetEntity = Taco.class)
58+
private List<Taco> tacos = new ArrayList<>();
59+
60+
public void addDesign(Taco design) {
61+
this.tacos.add(design);
62+
}
63+
64+
@PrePersist
65+
void placeAt(){
66+
this.placeAt = new Date();
67+
}
68+
969
}
Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,40 @@
11
package spring.security;
22

3+
import com.sun.istack.NotNull;
4+
import lombok.Data;
5+
6+
import javax.persistence.*;
7+
import javax.validation.constraints.Size;
8+
import java.util.Date;
9+
import java.util.List;
10+
311
/**
412
* @Created 17 / 03 / 2020 - 6:43 PM
513
* @project BootSecure
614
* @Author Hamdamboy
715
*/
8-
public class Taco
9-
{
16+
17+
@Data
18+
@Entity
19+
public class Taco {
20+
//
21+
22+
@Id
23+
@GeneratedValue(strategy = GenerationType.AUTO)
24+
private Long id;
25+
26+
@NotNull
27+
@Size(min=5, message = "Name be at least 5 characters long")
28+
private String name;
29+
30+
private Date createAt;
31+
32+
@ManyToMany(targetEntity = Ingredient.class)
33+
@Size(min=1, message = "You must choose at least 1 ingredient")
34+
private List <Ingredient> ingredients;
35+
36+
@PrePersist
37+
void createAt(){
38+
this.createAt = new Date();
39+
}
1040
}

Chapter4_Securing Spring/src/main/java/spring/security/User.java

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@
55
import lombok.NoArgsConstructor;
66
import lombok.RequiredArgsConstructor;
77
import org.springframework.security.core.GrantedAuthority;
8+
import org.springframework.security.core.authority.SimpleGrantedAuthority;
89
import org.springframework.security.core.userdetails.UserDetails;
910

1011
import javax.persistence.Entity;
12+
import javax.persistence.GeneratedValue;
13+
import javax.persistence.GenerationType;
14+
import javax.persistence.Id;
15+
import java.util.Arrays;
1116
import java.util.Collection;
1217

1318
/**
@@ -18,41 +23,53 @@
1823

1924
@Data
2025
@Entity
21-
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
22-
@RequiredArgsConstructor
26+
//@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
27+
//@RequiredArgsConstructor
28+
2329
public class User implements UserDetails {
2430
//
25-
private final String username;
26-
private final String password;
27-
private final String fullname;
28-
private final String street;
31+
@Id
32+
@GeneratedValue(strategy = GenerationType.AUTO)
33+
private Long id;
34+
35+
private String username;
36+
private String password;
37+
private String fullname;
38+
private String street;
2939
private String city;
3040
private String state;
3141
private String zip;
32-
private final String phoneNumber;
42+
private String phoneNumber;
43+
44+
public User(Long id, String city, String state, String zip) {
45+
this.id = id;
46+
this.city = city;
47+
this.state = state;
48+
this.zip = zip;
49+
}
3350

3451
@Override
3552
public Collection<? extends GrantedAuthority> getAuthorities() {
36-
return null;
53+
return Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"));
3754
}
3855

3956
@Override
4057
public boolean isAccountNonExpired() {
41-
return false;
58+
return true;
4259
}
4360

4461
@Override
4562
public boolean isAccountNonLocked() {
46-
return false;
63+
return true;
4764
}
4865

4966
@Override
5067
public boolean isCredentialsNonExpired() {
51-
return false;
68+
return true;
5269
}
5370

5471
@Override
5572
public boolean isEnabled() {
56-
return false;
73+
return true;
5774
}
5875
}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package spring.security.data;
22

3+
import org.springframework.data.repository.CrudRepository;
4+
import spring.security.Ingredient;
5+
36
/**
47
* @Created 17 / 03 / 2020 - 6:45 PM
58
* @project BootSecure
69
* @Author Hamdamboy
710
*/
8-
public class IngredientRepository {
11+
public interface IngredientRepository extends CrudRepository<Ingredient, String> {
912
}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package spring.security.data;
22

3+
import org.springframework.data.repository.CrudRepository;
4+
import spring.security.Order;
5+
36
/**
47
* @Created 17 / 03 / 2020 - 6:45 PM
58
* @project BootSecure
69
* @Author Hamdamboy
710
*/
8-
public class OrderRepository {
11+
public interface OrderRepository extends CrudRepository<Order, Long> {
912
}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package spring.security.data;
22

3+
import org.springframework.data.repository.CrudRepository;
4+
import spring.security.Taco;
5+
36
/**
47
* @Created 17 / 03 / 2020 - 6:46 PM
58
* @project BootSecure
69
* @Author Hamdamboy
710
*/
8-
public class TacoRepository {
11+
public interface TacoRepository extends CrudRepository<Taco, Long> {
912
}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package spring.security.data;
22

3+
import org.springframework.data.repository.CrudRepository;
4+
import org.springframework.security.core.userdetails.User;
5+
36
/**
47
* @Created 17 / 03 / 2020 - 6:46 PM
58
* @project BootSecure
69
* @Author Hamdamboy
710
*/
8-
public class UserRepository {
11+
public interface UserRepository extends CrudRepository<User, Long> {
12+
//
13+
User findByUsername(String username);
914
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,44 @@
11
package spring.security.security;
22

3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.security.crypto.password.PasswordEncoder;
5+
import org.springframework.stereotype.Controller;
6+
import org.springframework.web.bind.annotation.GetMapping;
7+
import org.springframework.web.bind.annotation.PostMapping;
8+
import org.springframework.web.bind.annotation.RequestMapping;
9+
import spring.security.data.UserRepository;
10+
311
/**
412
* @Created 17 / 03 / 2020 - 6:45 PM
513
* @project BootSecure
614
* @Author Hamdamboy
715
*/
16+
17+
@Controller
18+
@RequestMapping("/register")
819
public class RegistrationController {
20+
//
21+
private UserRepository userRepository;
22+
private PasswordEncoder passwordEncoder;
23+
24+
public RegistrationController(UserRepository userRepository, PasswordEncoder passwordEncoder) {
25+
this.userRepository = userRepository;
26+
this.passwordEncoder = passwordEncoder;
27+
}
28+
29+
@Autowired
30+
public String registerForm() {
31+
return "registration";
32+
}
33+
34+
@GetMapping
35+
public String registrationForm(){
36+
return "registration";
37+
}
38+
39+
@PostMapping
40+
public String processRegistration(RegistrationForm form) {
41+
userRepository.save(form.toUser(passwordEncoder));
42+
return "redirect:/login";
43+
}
944
}

0 commit comments

Comments
 (0)