Open Kilda Java Documentation
LoginController.java
Go to the documentation of this file.
1 package org.openkilda.controller;
2 
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.security.authentication.AuthenticationManager;
5 import org.springframework.security.authentication.BadCredentialsException;
6 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
7 import org.springframework.security.core.Authentication;
8 import org.springframework.security.core.context.SecurityContextHolder;
9 import org.springframework.security.core.userdetails.UsernameNotFoundException;
10 import org.springframework.stereotype.Controller;
11 import org.springframework.ui.Model;
12 import org.springframework.web.bind.annotation.RequestMapping;
13 import org.springframework.web.bind.annotation.RequestMethod;
14 import org.springframework.web.bind.annotation.RequestParam;
15 import org.springframework.web.servlet.ModelAndView;
16 
17 import java.util.HashSet;
18 import java.util.List;
19 import java.util.Set;
20 
21 import javax.servlet.http.HttpServletRequest;
22 
23 import org.apache.log4j.Logger;
37 
45 @Controller
46 public class LoginController extends BaseController {
47 
48  private static final Logger LOGGER = Logger.getLogger(LoginController.class);
49 
50  @Autowired
51  private AuthenticationManager authenticationManager;
52 
53  @Autowired
54  private UserService userService;
55 
56  @Autowired
57  private PermissionRepository permissionRepository;
58 
65  @RequestMapping(value = {"/", "/login"})
66  public ModelAndView login(final HttpServletRequest request) {
68  }
69 
76  @RequestMapping("/logout")
77  public ModelAndView logout(final Model model) {
78  return new ModelAndView(IConstants.View.LOGOUT);
79  }
80 
89  @RequestMapping(value = "/authenticate", method = RequestMethod.POST)
90  public ModelAndView authenticate(@RequestParam("username") final String username,
91  @RequestParam("password") final String password, final HttpServletRequest request) {
92  LOGGER.info("[authenticate] - start");
93  ModelAndView modelAndView = new ModelAndView(IConstants.View.LOGIN);
94  String error = null;
95  UsernamePasswordAuthenticationToken token =
96  new UsernamePasswordAuthenticationToken(username, password);
97  CustomWebAuthenticationDetails customWebAuthenticationDetails = new CustomWebAuthenticationDetails(request);
98  token.setDetails(customWebAuthenticationDetails);
99 
100  try {
101  Authentication authenticate = authenticationManager.authenticate(token);
102  if (authenticate.isAuthenticated()) {
103  modelAndView.setViewName(IConstants.View.REDIRECT_HOME);
104  UserInfo userInfo = getLoggedInUser(request);
105  populateUserInfo(userInfo, username);
106  request.getSession().setAttribute(IConstants.SESSION_OBJECT, userInfo);
107  SecurityContextHolder.getContext().setAuthentication(authenticate);
108  userService.updateLoginDetail(username);
109  } else {
110  error = "Invalid email or password";
111  LOGGER.error(
112  "authenticate() Authentication failure with username{} and password{}");
113  modelAndView.setViewName(IConstants.View.REDIRECT_LOGIN);
114  }
115  } catch (@SuppressWarnings("unused") TwoFaKeyNotSetException e) {
116  LOGGER.error("2 FA Key not set for user: '" + username + "'.");
117  modelAndView.addObject("username", username);
118  modelAndView.addObject("password", password);
119 
120  String secretKey = TwoFactorUtility.getBase32EncryptedKey();
121  modelAndView.addObject("key", secretKey);
122  userService.updateUser2FAKey(username, secretKey);
123 
124  modelAndView.setViewName(IConstants.View.TWO_FA_GENERATOR);
125  } catch (@SuppressWarnings("unused") OtpRequiredException e) {
126  LOGGER.error("OTP required for user: '" + username + "'.");
127  modelAndView.addObject("username", username);
128  modelAndView.addObject("password", password);
129  modelAndView.setViewName(IConstants.View.OTP);
130  } catch (@SuppressWarnings("unused") InvalidOtpException e) {
131  LOGGER.error("Authentication code is invalid for user: '" + username + "'.");
132  error = "Authentication code is invalid";
133  modelAndView.addObject("username", username);
134  modelAndView.addObject("password", password);
135  if(customWebAuthenticationDetails.isConfigure2Fa()) {
136  UserEntity userInfo = userService.getUserByUsername(username);
137  modelAndView.addObject("key", userInfo.getTwoFaKey());
138  modelAndView.setViewName(IConstants.View.TWO_FA_GENERATOR);
139  } else {
140  modelAndView.setViewName(IConstants.View.OTP);
141  }
142  } catch (UsernameNotFoundException | BadCredentialsException e) {
143  LOGGER.error("authenticate() Authentication failure", e);
144  error = "Invalid email or password";
145  modelAndView.setViewName(IConstants.View.REDIRECT_LOGIN);
146  } catch (Exception e) {
147  LOGGER.error("authenticate() Authentication failure", e);
148  error = "Login Failed. Error: '" + e.getMessage() + "'.";
149  modelAndView.setViewName(IConstants.View.REDIRECT_LOGIN);
150  }
151 
152  if (error != null) {
153  modelAndView.addObject("error", error);
154  }
155  return modelAndView;
156  }
157 
165  private void populateUserInfo(final UserInfo userInfo, final String username) {
166  UserEntity user = userService.getUserByUsername(username);
167  Set<RoleEntity> roleEntities = user.getRoles();
168  Set<String> roles = new HashSet<String>();
169  Set<String> permissions = new HashSet<String>();
170  for (RoleEntity roleEntity : roleEntities) {
171  roles.add(roleEntity.getName());
172  userInfo.setRole("ROLE_ADMIN");
173  if (user.getUserId() != 1) {
174  Set<PermissionEntity> permissionEntities = roleEntity.getPermissions();
175  for (PermissionEntity permissionEntity : permissionEntities) {
176  if (permissionEntity.getStatusEntity().getStatusCode().equalsIgnoreCase(Status.ACTIVE.getCode())
177  && !permissionEntity.getIsAdminPermission()) {
178  permissions.add(permissionEntity.getName());
179  }
180  }
181  }
182  }
183  if (user.getUserId() == 1) {
184  List<PermissionEntity> permissionEntities = permissionRepository.findAll();
185  for (PermissionEntity permissionEntity : permissionEntities) {
186  permissions.add(permissionEntity.getName());
187  }
188  }
189  userInfo.setUserId(user.getUserId());
190  userInfo.setUsername(user.getUsername());
191  userInfo.setName(user.getName());
192  userInfo.setRoles(roles);
193  userInfo.setPermissions(permissions);
194  userInfo.setIs2FaEnabled(user.getIs2FaEnabled());
195  }
196 }
ModelAndView error(final Model model)
value
Definition: nodes.py:62
static final String SESSION_OBJECT
Definition: IConstants.java:15
void setUsername(final String username)
Definition: UserInfo.java:97
ModelAndView validateAndRedirect(final HttpServletRequest request, final String viewName)
void setIs2FaEnabled(final Boolean is2FaEnabled)
Definition: UserInfo.java:279
UserInfo getLoggedInUser(final HttpServletRequest request)
ModelAndView login(final HttpServletRequest request)
ModelAndView authenticate(@RequestParam("username") final String username, @RequestParam("password") final String password, final HttpServletRequest request)
ModelAndView logout(final Model model)
void setRoles(final Set< String > roles)
Definition: UserInfo.java:154
void setPermissions(final Set< String > permissions)
Definition: UserInfo.java:245
void setName(final String name)
Definition: UserInfo.java:115
void setUserId(final Long userId)
Definition: UserInfo.java:79
void setRole(final String role)
Definition: UserInfo.java:133