AuthController.java
package me.schawe.multijsnake.usermanagement;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.*;
import java.util.stream.Collectors;
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/api/auth")
public class AuthController {
final AuthenticationManager authenticationManager;
final UserRepository userRepository;
// @Autowired
// RoleRepository roleRepository;
final PasswordEncoder encoder;
final JwtUtils jwtUtils;
AuthController(UserDetailsServiceImpl userDetailsService, AuthenticationManager authenticationManager, UserRepository userRepository, PasswordEncoder encoder, JwtUtils jwtUtils){
this.authenticationManager = authenticationManager;
this.userRepository = userRepository;
this.encoder = encoder;
this.jwtUtils = jwtUtils;
}
private JwtResponse jwtFromUserAndPasswort(String username, String password) {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(username, password));
SecurityContextHolder.getContext().setAuthentication(authentication);
String jwt = jwtUtils.generateJwtToken(authentication);
UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();
List<String> roles = userDetails.getAuthorities().stream()
.map(item -> item.getAuthority())
.collect(Collectors.toList());
return new JwtResponse(jwt,
userDetails.getId(),
userDetails.getUsername(),
userDetails.getEmail(),
roles);
}
@PostMapping("/login")
public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {
return ResponseEntity.ok(jwtFromUserAndPasswort(loginRequest.getUsername(), loginRequest.getPassword()));
}
@PostMapping("/register")
public ResponseEntity<?> registerUser(@Valid @RequestBody RegistrationRequest registrationRequest) {
Map<String, String> errors = new HashMap<>();
if (userRepository.existsByUsername(registrationRequest.getUsername())) {
errors.put("username", "Username is already taken!");
}
if (userRepository.existsByEmail(registrationRequest.getEmail())) {
errors.put("email", "Email is already registered!");
}
if (errors.size() == 0) {
// Create new user's account
User user = new User(
registrationRequest.getUsername(),
registrationRequest.getEmail(),
encoder.encode(registrationRequest.getPassword())
);
userRepository.save(user);
return ResponseEntity.ok(jwtFromUserAndPasswort(registrationRequest.getUsername(), registrationRequest.getPassword()));
} else {
return ResponseEntity.badRequest().body(errors);
}
}
}