@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
@EnableWebSecurity
@EnableJpaRepositories(basePackageClasses = UserRepository.class)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
CustomUserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService)
.passwordEncoder(getPasswordEncoder());
}
@Override
protected void configure (HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers( "/registration", "/logout", "/login", "/homepage/**").permitAll()
.antMatchers("/","/**").authenticated()
.anyRequest().permitAll()
.and().formLogin().loginPage("/login")
.permitAll()
.and()
.logout().permitAll()
.and()
.exceptionHandling().accessDeniedPage("/accessDenied");
}
private PasswordEncoder getPasswordEncoder() {
return new PasswordEncoder() {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}
@Override
public boolean matches(CharSequence charSequence, String s) {
return true;
}
};
}
}
import java.util.HashSet;
import java.util.Set;
@Controller
public class UserRegistrationController {
@Autowired
private UserRepository userRepository;
@GetMapping(path="/registration")
public String showRegistartionForm(Model model) {
model.addAttribute("user", new User());
return "registration";
}
@RequestMapping(path="/registration", method = RequestMethod.POST)
public String registrationProcess(@ModelAttribute("user")User user) {
String login = user.getLogin();
String name = user.getUsername();
String surname = user.getSurname();
String password = user.getPassword();
if (login != null && !login.isEmpty() && name != null && !name.isEmpty() && surname != null && !surname.isEmpty()
&& password != null && !password.isEmpty()) {
String hashedPassword = BCrypt.hashpw(password, BCrypt.gensalt(10));
Set<Role> roles = new HashSet<>();
roles.add(Role.USER);
user.setRole(roles);
user.setActive(true);
user.setPassword(hashedPassword);
user.setUsername(name);
user.setLogin(login);
user.setSurname(surname);
userRepository.save(user);
return "login";
}
return "registration";
}
}
import java.util.Collection;
import java.util.stream.Collectors;
public class CustomUserDetails extends User implements UserDetails {
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return getRole()
.stream()
.map(role -> new SimpleGrantedAuthority("ROLE_" + role))
.collect(Collectors.toList());
}
public CustomUserDetails(final User user){
super(user);
}
@Override
public String getPassword() {
return super.getPassword();
}
@Override
public String getUsername() {
return super.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
@Entity
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode
@ToString
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
@NotEmpty
private String login;
@Column(unique = true)
@Email
@NotEmpty
private String email;
@NotEmpty
private String username;
@NotEmpty
private String surname;
@NotEmpty
private String password;
@ManyToMany(fetch = FetchType.LAZY)
private Set<Project> project;
@ManyToMany(mappedBy = "users")
private Set<Task> tasks;
private boolean active;
@ElementCollection(fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
private Set<Role> role;
public User (User user){
this.password = user.getPassword();
this.id = user.getId();
this.surname = user.getSurname();
this.username = user.getUsername();
this.login = user.getLogin();
this.email = user.getEmail();
this.role = user.getRole();
}
}
public enum Role {
ADMIN,
USER
}
import java.util.List;
import java.util.Optional;
public interface UserRepository extends JpaRepository<User,Long> {
Optional<User> findById(Long id);
List <User> findAll();
Optional <User> findByUsername(String username);
}
import org.springframework.security.core.Authentication;
public interface AuthenticationFacade {
Authentication getAuthentication();
}
import java.util.Optional;
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Optional<User> optionalUser = userRepository.findByUsername(username);
optionalUser
.orElseThrow(()-> new UsernameNotFoundException("Username not found"));
return optionalUser
.map(user -> new CustomUserDetails(user)).get();
}
}
!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css"
integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
<script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
</head>
<body>
<div class="jumbotron">
<div class="container">
<h1>CRM</h1>
<p>Welcome in CRM Application</p>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<div class="panel panel-login">
<form id="register-form" method="post" th:action="@{'/registration'}" th:object="${user}" role="form" style="display:block">
<div class="form-group">
<input th:field="*{login}" name="login" id="login" tabindex="1" class="form-control" placeholder="Login">
</div>
<div class="form-group">
<input th:field="*{username}" name="username" id="username" tabindex="1" class="form-control" placeholder="Username">
</div>
<div class="form-group">
<input th:field="*{surname}" name="surname" id="surname" tabindex="1" class="form-control" placeholder="Last name">
</div>
<div class="form-group">
<input th:field="*{email}" name="email" id="email" tabindex="1" class="form-control" placeholder="Email">
</div>
<div class="form-group">
<input th:field="*{password}" type="password" name="password" id="password" tabindex="2" class="form-control" placeholder="Password">
</div>
<div class="form-group">
<div class="row">
<div class="col-sm-6 col-sm-offset-3">
<input type="submit" name="register-submit" id="register-submit" tabindex="4" class="form-control btn btn-register" value="Register Now">
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>