1 package org.openkilda.auth.interceptor;
3 import org.slf4j.Logger;
4 import org.slf4j.LoggerFactory;
7 import org.springframework.beans.factory.annotation.Autowired;
8 import org.springframework.stereotype.Component;
9 import org.springframework.web.method.HandlerMethod;
10 import org.springframework.web.servlet.ModelAndView;
11 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
13 import java.nio.file.AccessDeniedException;
14 import java.util.HashSet;
15 import java.util.List;
17 import java.util.UUID;
19 import javax.servlet.http.HttpServletRequest;
20 import javax.servlet.http.HttpServletResponse;
21 import javax.servlet.http.HttpSession;
41 private static final Logger LOGGER = LoggerFactory.getLogger(
RequestInterceptor.class);
42 private static final String CORRELATION_ID =
"correlationid";
60 public boolean preHandle(
final HttpServletRequest request,
final HttpServletResponse response,
61 final Object handler)
throws Exception {
62 String correlationId = request.getParameter(CORRELATION_ID);
63 correlationId = correlationId == null ? UUID.randomUUID().toString() : correlationId;
66 MDC.put(CORRELATION_ID, correlationId);
67 HttpSession session = request.getSession();
71 if (userInfo != null) {
72 if (handler instanceof HandlerMethod) {
73 HandlerMethod handlerMethod = (HandlerMethod) handler;
75 handlerMethod.getMethod().getAnnotation(
Permissions.class);
76 if (permissions != null) {
77 validateAndPopulatePermisssion(userInfo, permissions);
80 updateRequestContext(correlationId, request, userInfo);
82 }
catch (IllegalStateException ex) {
84 "[getLoggedInUser] Exception while retrieving user information from session. Exception: " 85 + ex.getLocalizedMessage(),
92 public void postHandle(
final HttpServletRequest request,
final HttpServletResponse response,
93 final Object handler,
final ModelAndView modelAndView)
throws Exception {
94 super.postHandle(request, response, handler, modelAndView);
95 MDC.remove(CORRELATION_ID);
98 private void updateRequestContext(
final String correlationId,
final HttpServletRequest request,
100 RequestContext requestContext = serverContext.getRequestContext();
109 private void validateAndPopulatePermisssion(
final UserInfo userInfo,
110 final Permissions permissions)
throws Exception {
111 if (!permissions.checkObjectAccessPermissions()) {
112 if (!hasPermissions(userInfo, permissions.values())) {
113 LOGGER.error(
"Access Denied. User(id: " + userInfo.
getUserId()
114 +
") not have the permission to perform this operation. Permissions required " + permissions.values());
115 throw new AccessDeniedException(messageUtils.getUnauthorizedMessage());
120 private boolean hasPermissions(
final UserInfo userInfo,
final String... permissions) {
121 boolean hasPermission =
true;
122 Set<String> availablePermissions = availablePermissions(userInfo);
123 if (!availablePermissions.isEmpty()) {
124 for (String permission : permissions) {
125 if (!availablePermissions.contains(permission)) {
126 hasPermission =
false;
131 hasPermission =
false;
133 return hasPermission;
136 private Set<String> availablePermissions(
final UserInfo userInfo) {
137 Set<String> availablePermissions =
new HashSet<>();
138 UserEntity userEntity = userRepository.findByUserId(userInfo.getUserId());
139 if (userInfo.getUserId() != 1 && userEntity != null
140 && Status.ACTIVE.getStatusEntity().equals(userEntity.getStatusEntity())) {
141 Set<String> roles = userInfo.getRoles();
142 if (roles != null && roles.size() > 0) {
143 List<Role> roleList = roleService.getRoleByName(roles);
144 for (Role role : roleList) {
145 if (Status.ACTIVE.getStatusEntity().getStatus()
146 .equalsIgnoreCase(role.getStatus()) && role.getPermissions() != null) {
147 for (Permission permission : role.getPermissions()) {
148 if (Status.ACTIVE.getStatusEntity().getStatus()
149 .equalsIgnoreCase(permission.getStatus())) {
150 availablePermissions.add(permission.getName());
157 List<Permission> permissions = permissionService.getAllPermission(userInfo.getUserId());
158 for (Permission permission : permissions) {
159 availablePermissions.add(permission.getName());
162 userInfo.setPermissions(availablePermissions);
163 return availablePermissions;
166 private static String getClientIp(
final HttpServletRequest request) {
167 String remoteAddr =
"";
168 if (request != null) {
169 remoteAddr = request.getHeader(
"X-FORWARDED-FOR");
170 if (remoteAddr == null ||
"".equals(remoteAddr)) {
171 remoteAddr = request.getRemoteAddr();
void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final ModelAndView modelAndView)
boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler)
Set< String > getPermissions()
static final String SESSION_OBJECT
void setClientIpAddress(final String clientIpAddress)
void setCorrelationId(final String correlationId)
void setUserId(final Long userId)
void setPermissions(final Set< String > permissions)
void setUserName(final String userName)