Skip to content

Commit bc182ac

Browse files
Registration and authorization with spring security
1 parent 246d46a commit bc182ac

18 files changed

+431
-4
lines changed

Job_Board/src/main/java/com/bulat/jobboard/JobboardApplication.java

+7
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.web.client.RestTemplate;
57

68
@SpringBootApplication
79
public class JobboardApplication {
810

11+
@Bean
12+
public RestTemplate restTemplate(){
13+
return new RestTemplate();
14+
}
15+
916
public static void main(String[] args) {
1017
SpringApplication.run(JobboardApplication.class, args);
1118
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.bulat.jobboard.config;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.security.authentication.AuthenticationManager;
6+
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7+
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
8+
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
9+
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
10+
import org.springframework.security.crypto.password.PasswordEncoder;
11+
12+
@Configuration
13+
@EnableWebSecurity
14+
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
15+
16+
@Bean
17+
public PasswordEncoder passwordEncoder() {
18+
return new BCryptPasswordEncoder();
19+
}
20+
21+
@Bean
22+
@Override
23+
public AuthenticationManager authenticationManagerBean() throws Exception {
24+
return super.authenticationManagerBean();
25+
}
26+
27+
@Override
28+
protected void configure(HttpSecurity http) throws Exception {
29+
http.httpBasic().disable()
30+
.csrf().disable();
31+
32+
http.formLogin()
33+
.loginPage("/signIn")
34+
.loginProcessingUrl("/signIn")
35+
.usernameParameter("email")
36+
.defaultSuccessUrl("/blog");
37+
38+
http.logout()
39+
.logoutUrl("/logout")
40+
.logoutSuccessUrl("/signIn");
41+
42+
http.authorizeRequests()
43+
.antMatchers("/css/**","/img/**","/fonts/**","/js/**","/scss/**","/token/**").permitAll()
44+
.antMatchers("/signIn", "/signUp").anonymous()
45+
.antMatchers("/**").authenticated();
46+
}
47+
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,32 @@
11
package com.bulat.jobboard.controller;
22

3+
import com.bulat.jobboard.utils.Attributes;
4+
import org.springframework.security.web.WebAttributes;
35
import org.springframework.stereotype.Controller;
6+
import org.springframework.ui.ModelMap;
47
import org.springframework.web.bind.annotation.GetMapping;
58
import org.springframework.web.bind.annotation.RequestMapping;
9+
import org.springframework.web.bind.annotation.RequestParam;
10+
11+
import javax.naming.AuthenticationException;
12+
import javax.servlet.http.HttpServletRequest;
13+
import javax.servlet.http.HttpSession;
14+
import java.util.logging.LogManager;
615

716
@Controller
817
@RequestMapping("/signIn")
918
public class SignInController {
1019

1120
@GetMapping
12-
public String getEntrance(){
21+
public String getSignIn(HttpServletRequest request, ModelMap modelMap, @RequestParam(value = "error", required = false) String error){
22+
LogManager.getLogManager().reset();
23+
HttpSession session = request.getSession(false);
24+
if (session != null && error != null){
25+
AuthenticationException ex = (AuthenticationException) session.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
26+
if (ex != null) {
27+
Attributes.addErrorAttributes(modelMap, ex.getMessage());
28+
}
29+
}
1330
return "signIn";
1431
}
1532
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,72 @@
11
package com.bulat.jobboard.controller;
22

3+
import com.bulat.jobboard.dto.CaptchaResponseDto;
4+
import com.bulat.jobboard.model.User;
5+
import com.bulat.jobboard.service.UserService;
6+
import com.bulat.jobboard.utils.Attributes;
7+
import com.bulat.jobboard.utils.UserValidator;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.beans.factory.annotation.Value;
310
import org.springframework.stereotype.Controller;
11+
import org.springframework.ui.ModelMap;
12+
import org.springframework.validation.BindingResult;
413
import org.springframework.web.bind.annotation.GetMapping;
14+
import org.springframework.web.bind.annotation.PostMapping;
515
import org.springframework.web.bind.annotation.RequestMapping;
16+
import org.springframework.web.bind.annotation.RequestParam;
17+
import org.springframework.web.client.RestTemplate;
18+
19+
import java.util.Collections;
20+
import java.util.Objects;
621

722
@Controller
823
@RequestMapping("/signUp")
924
public class SignUpController {
25+
private final static String CAPTCHA_URL = "https://www.google.com/recaptcha/api/siteverify?secret=%s&response=%s";
26+
27+
private final UserValidator userValidator;
28+
private final RestTemplate restTemplate;
29+
private final UserService userService;
30+
31+
@Value("${recaptcha.secret}")
32+
private String secret;
33+
34+
@Autowired
35+
public SignUpController(UserValidator userValidator, RestTemplate restTemplate, UserService userService) {
36+
this.userValidator = userValidator;
37+
this.restTemplate = restTemplate;
38+
this.userService = userService;
39+
}
1040

1141
@GetMapping
1242
public String getRegistration(){
1343
return "signUp";
1444
}
45+
46+
@PostMapping
47+
public String signUp(User user, BindingResult result, ModelMap model,
48+
@RequestParam("g-recaptcha-response") String captchaResponse){
49+
userValidator.validate(user, result);
50+
StringBuilder error = errorChecking(captchaResponse, result);
51+
if (error.length() == 0){
52+
Attributes.addSuccessAttributes(model, "Success!");
53+
userService.signUp(user);
54+
}else{
55+
Attributes.addErrorAttributes(model, String.valueOf(error));
56+
}
57+
return "/signUp";
58+
}
59+
60+
private StringBuilder errorChecking(String captchaResponse, BindingResult result){
61+
StringBuilder builder = new StringBuilder();
62+
String url = String.format(CAPTCHA_URL, secret, captchaResponse);
63+
CaptchaResponseDto response = restTemplate.postForObject(url, Collections.emptyList(), CaptchaResponseDto.class);
64+
if (!Objects.requireNonNull(response).isSuccess()) {
65+
builder.append("Fill captcha! ");
66+
}
67+
if (result.hasErrors()) {
68+
builder.append("This mail is already taken! ");
69+
}
70+
return builder;
71+
}
1572
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.bulat.jobboard.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonAlias;
4+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
import java.util.Set;
11+
12+
@Data
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@Builder
16+
@JsonIgnoreProperties(ignoreUnknown = true)
17+
public class CaptchaResponseDto {
18+
private boolean success;
19+
20+
@JsonAlias("error-codes")
21+
private Set<String> errorCodes;
22+
}

Job_Board/src/main/java/com/bulat/jobboard/model/BaseEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
@MappedSuperclass
1111
@Data
12-
public class BaseEntity {
12+
class BaseEntity {
1313

1414
@Id
1515
@GeneratedValue(strategy = GenerationType.IDENTITY)

Job_Board/src/main/java/com/bulat/jobboard/model/Role.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.Data;
44
import lombok.EqualsAndHashCode;
5+
import org.springframework.security.core.GrantedAuthority;
56

67
import javax.persistence.*;
78
import java.util.List;
@@ -10,11 +11,16 @@
1011
@Data
1112
@Entity
1213
@Table(name = "roles")
13-
public class Role extends BaseEntity{
14+
public class Role extends BaseEntity implements GrantedAuthority {
1415

1516
@Column(name = "name")
1617
private String name;
1718

1819
@ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY)
1920
private List<User> users;
21+
22+
@Override
23+
public String getAuthority() {
24+
return name;
25+
}
2026
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.bulat.jobboard.repository;
2+
3+
import com.bulat.jobboard.model.Role;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
import java.util.Optional;
8+
9+
@Repository
10+
public interface RoleRepository extends JpaRepository<Role, Long> {
11+
Optional<Role> findByName(String name);
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.bulat.jobboard.repository;
2+
3+
import com.bulat.jobboard.model.User;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
import java.util.Optional;
7+
8+
public interface UserRepository extends JpaRepository<User, Long> {
9+
Optional<User> findByEmail(String email);
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.bulat.jobboard.security.details;
2+
3+
import com.bulat.jobboard.model.State;
4+
import com.bulat.jobboard.model.User;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
import org.springframework.security.core.GrantedAuthority;
8+
import org.springframework.security.core.userdetails.UserDetails;
9+
10+
import java.util.Collection;
11+
12+
@AllArgsConstructor
13+
public class UserDetailsImpl implements UserDetails {
14+
15+
@Getter
16+
private User user;
17+
18+
@Override
19+
public Collection<? extends GrantedAuthority> getAuthorities() {
20+
return user.getRoles();
21+
}
22+
23+
@Override
24+
public String getPassword() {
25+
return user.getPassword();
26+
}
27+
28+
@Override
29+
public String getUsername() {
30+
return user.getEmail();
31+
}
32+
33+
@Override
34+
public boolean isAccountNonExpired() {
35+
return true;
36+
}
37+
38+
@Override
39+
public boolean isAccountNonLocked() {
40+
return true;
41+
}
42+
43+
@Override
44+
public boolean isCredentialsNonExpired() {
45+
return true;
46+
}
47+
48+
@Override
49+
public boolean isEnabled() {
50+
return user.getStatus().equals(State.ACTIVE);
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.bulat.jobboard.security.service;
2+
3+
import com.bulat.jobboard.model.User;
4+
import com.bulat.jobboard.security.details.UserDetailsImpl;
5+
import com.bulat.jobboard.service.UserService;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.security.core.userdetails.UserDetails;
8+
import org.springframework.security.core.userdetails.UserDetailsService;
9+
import org.springframework.security.core.userdetails.UsernameNotFoundException;
10+
import org.springframework.stereotype.Service;
11+
12+
import java.util.Optional;
13+
14+
@Service
15+
public class UserDetailsServiceImpl implements UserDetailsService {
16+
17+
private final UserService userService;
18+
19+
@Autowired
20+
public UserDetailsServiceImpl(UserService userService) {
21+
this.userService = userService;
22+
}
23+
24+
@Override
25+
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
26+
Optional<User> userOptional = userService.findByEmail(s);
27+
if (userOptional.isPresent()){
28+
User user = userOptional.get();
29+
return new UserDetailsImpl(user);
30+
}
31+
throw new UsernameNotFoundException("User not found");
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.bulat.jobboard.service;
2+
3+
import com.bulat.jobboard.model.Role;
4+
import org.springframework.stereotype.Service;
5+
6+
import java.util.Optional;
7+
8+
@Service
9+
public interface RoleService {
10+
11+
Role save(Role role);
12+
13+
Optional<Role> findByName(String name);
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.bulat.jobboard.service;
2+
3+
import com.bulat.jobboard.model.User;
4+
import org.springframework.stereotype.Service;
5+
6+
import java.util.Optional;
7+
8+
@Service
9+
public interface UserService {
10+
Optional<User> findByEmail(String email);
11+
12+
void signUp(User user);
13+
14+
User save(User user);
15+
}

0 commit comments

Comments
 (0)