package com.huixinpn.dionysus.controller; import com.huixinpn.dionysus.domain.user.User; import com.huixinpn.dionysus.dto.user.UserData; import com.huixinpn.dionysus.repository.user.NotificationRepository; import com.huixinpn.dionysus.service.ConsultantService; import com.huixinpn.dionysus.service.UserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.context.HttpRequestResponseHolder; import org.springframework.security.web.context.HttpSessionSecurityContextRepository; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.HashMap; @RestController @RequestMapping("/api/v1") public class LoginController { private static Logger logger = LoggerFactory.getLogger(LoginController.class); private UserService userService; private ConsultantService consultantService; private NotificationRepository notificationRepository; private HttpSessionSecurityContextRepository sessionSecurityContextRepository = new HttpSessionSecurityContextRepository(); @Autowired public LoginController(UserService userservice, ConsultantService consultantservice, NotificationRepository notificationRepository) { this.userService = userservice; this.consultantService = consultantservice; this.notificationRepository = notificationRepository; } @RequestMapping(value = "/login", method = RequestMethod.POST) public @ResponseBody User login(@RequestBody User user, HttpServletRequest request, HttpServletResponse response) { User loginedUser = userService.sign(user.getUsername(), user.getPassword()); UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(loginedUser, user.getPassword(), loginedUser.getAuthorities()); auth.setDetails(loginedUser.getId()); SecurityContext context = SecurityContextHolder.getContext(); context.setAuthentication(auth); HttpRequestResponseHolder requestResponseHolder = new HttpRequestResponseHolder(request, response); sessionSecurityContextRepository.saveContext(context, requestResponseHolder.getRequest(), requestResponseHolder.getResponse()); Long notification_count = notificationRepository.countByInbox(loginedUser.getInbox()); loginedUser.setNotificationCount(notification_count); return loginedUser; } @RequestMapping(value = "/logout", method = RequestMethod.GET) public String logout(HttpSession session) { if (session != null) session.invalidate(); return "success"; } @RequestMapping(value = "/register", method = RequestMethod.POST) public User register(@RequestBody User user) { return userService.register(user); } @RequestMapping(value = "/registerconsultant", method = RequestMethod.POST) public User consultant(@RequestBody User consultant) { return consultantService.registerconsultant(consultant); } @RequestMapping(value = "/updateprofile", method = RequestMethod.POST) public User updateprofile(@RequestBody User user) { return userService.updateprofile(user); } @RequestMapping(value = "/changepass", method = RequestMethod.POST) public Object changePassword(@RequestBody PassTemplate pass) { HashMap<String, String> revalue = new HashMap<>(); userService.changePassword(pass.getOldPass(), pass.getNewPass(), revalue); return revalue; } @RequestMapping(value = "/currentuser", method = RequestMethod.GET) public UserData currentloginUser() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); User login = (User) authentication.getPrincipal(); return new UserData(login); } }