diff --git a/src/main/java/eu/hbp/mip/configuration/SecurityConfiguration.java b/src/main/java/eu/hbp/mip/configuration/SecurityConfiguration.java index f6a82a57133ff56f77471157c65a130c7cb3cc9b..adc3df815fbc74d27f78e8bbf661ff31fc168a89 100644 --- a/src/main/java/eu/hbp/mip/configuration/SecurityConfiguration.java +++ b/src/main/java/eu/hbp/mip/configuration/SecurityConfiguration.java @@ -1,10 +1,7 @@ package eu.hbp.mip.configuration; import eu.hbp.mip.model.UserInfo; -import eu.hbp.mip.utils.CORSFilter; -import eu.hbp.mip.utils.CustomLoginUrlAuthenticationEntryPoint; -import eu.hbp.mip.utils.HTTPUtil; -import eu.hbp.mip.utils.UserActionLogging; +import eu.hbp.mip.utils.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -17,7 +14,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.*; -import org.springframework.security.access.AccessDeniedException; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.Authentication; @@ -40,8 +36,6 @@ import org.springframework.security.web.csrf.CsrfTokenRepository; import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.client.RestTemplate; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.WebUtils; @@ -111,15 +105,6 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Value("#{'${hbp.resource.revokeTokenUri:https://services.humanbrainproject.eu/oidc/revoke}'}") private String revokeTokenURI; - @ControllerAdvice - class AccessDeniedExceptionHandler { - - @ExceptionHandler(value = AccessDeniedException.class) - public void handleConflict(HttpServletResponse response) throws IOException { - response.sendError(403, "Access is denied. Please contact the system administrator to request access."); - } - } - @Override protected void configure(HttpSecurity http) throws Exception { disableCertificateValidation(); @@ -137,6 +122,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { //.anyRequest().authenticated() .anyRequest().hasRole("Researcher") .and().exceptionHandling().authenticationEntryPoint(new CustomLoginUrlAuthenticationEntryPoint(loginUrl)) + .accessDeniedHandler(new CustomAccessDeniedHandler()) .and().logout().addLogoutHandler(authLogoutHandler()).logoutSuccessUrl(redirectAfterLogoutUrl) .and().logout().permitAll() .and().csrf().ignoringAntMatchers("/logout").csrfTokenRepository(csrfTokenRepository()) diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java index 262b6512f6d22428979bbb98b8c6b428a6b1e5ea..0c027d4978eab28fdd61633a8b68c320598c50ec 100644 --- a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java +++ b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java @@ -64,7 +64,7 @@ public class ExperimentApi { @Value("#{'${services.workflows.workflowUrl}'}") private String workflowUrl; - @Value("#{'${services.workflows.jwtSecret}'}")Α + @Value("#{'${services.workflows.jwtSecret}'}") private String jwtSecret; @Value("#{'${services.galaxy.galaxyUrl}'}") diff --git a/src/main/java/eu/hbp/mip/controllers/SecurityApi.java b/src/main/java/eu/hbp/mip/controllers/SecurityApi.java index ee24f17d97573ffe2a416c6cc4cba766a94e4cbd..397f1ae6c149a3693632a0b7817709d6cb2318f3 100644 --- a/src/main/java/eu/hbp/mip/controllers/SecurityApi.java +++ b/src/main/java/eu/hbp/mip/controllers/SecurityApi.java @@ -5,20 +5,19 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.JsonObject; import eu.hbp.mip.configuration.SecurityConfiguration; -import org.springframework.beans.factory.annotation.Value; import eu.hbp.mip.model.User; import eu.hbp.mip.model.UserInfo; import eu.hbp.mip.repositories.UserRepository; +import eu.hbp.mip.utils.UserActionLogging; import io.swagger.annotations.ApiParam; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.prepost.PreAuthorize; -import eu.hbp.mip.utils.UserActionLogging; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; @@ -45,8 +44,8 @@ public class SecurityApi { @RequestMapping(path = "/user", method = RequestMethod.GET) public Object user(Principal principal, HttpServletResponse response) { ObjectMapper mapper = new ObjectMapper(); - - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "get user from /user",""); + + UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "get user from /user", ""); try { String userJSON = mapper.writeValueAsString(userInfo.getUser()); Cookie cookie = new Cookie("user", URLEncoder.encode(userJSON, "UTF-8")); @@ -77,9 +76,9 @@ public class SecurityApi { user.setAgreeNDA(agreeNDA); userRepository.save(user); } - - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "user agreeNDA",""); - + + UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "user agreeNDA", ""); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -106,16 +105,15 @@ public class SecurityApi { */ @RequestMapping(path = "/galaxy", method = RequestMethod.GET, produces = "application/json") - @PreAuthorize("hasRole('Data Manager')") + @PreAuthorize("hasRole('Data Manager')") @ResponseStatus(value = HttpStatus.OK) - public ResponseEntity getGalaxyConfiguration(){ + public ResponseEntity getGalaxyConfiguration() { String stringEncoded = Base64.getEncoder().encodeToString((galaxyUsername + ":" + galaxyPassword).getBytes()); JsonObject object = new JsonObject(); object.addProperty("authorization", stringEncoded); object.addProperty("context", galaxyContext); - UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "get galaxy information",""); - + UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "get galaxy information", ""); + return ResponseEntity.ok(gson.toJson(object)); } - } diff --git a/src/main/java/eu/hbp/mip/utils/CustomAccessDeniedHandler.java b/src/main/java/eu/hbp/mip/utils/CustomAccessDeniedHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..783e4a3ff68ab3384a798d9fc70f68f29c114bd6 --- /dev/null +++ b/src/main/java/eu/hbp/mip/utils/CustomAccessDeniedHandler.java @@ -0,0 +1,33 @@ +package eu.hbp.mip.utils; + +import org.codehaus.jettison.json.JSONException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Timestamp; + +public class CustomAccessDeniedHandler implements AccessDeniedHandler { + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, + AccessDeniedException accessDeniedException) throws IOException, ServletException { + response.setContentType("application/json;charset=UTF-8"); + response.setStatus(403); + try { + response.getWriter().write(new JSONObject() + .put("timestamp", new Timestamp(System.currentTimeMillis())) + .put("status", 403) + .put("error", "Forbidden") + .put("message", "Access Denied. Please contact the system administrator to request access.") + .put("path", request.getServletPath()) + .toString()); + } catch (JSONException e) { + response.getWriter().write(""); + e.printStackTrace(); + } + } +}