argos/dmp-backend/src/main/java/eu/eudat/handlers/PrincipalArgumentResolver.java

55 lines
2.5 KiB
Java
Raw Normal View History

2017-12-15 17:57:41 +01:00
package eu.eudat.handlers;
2018-02-07 10:56:30 +01:00
import eu.eudat.exceptions.security.UnauthorisedException;
2017-12-15 17:57:41 +01:00
import eu.eudat.models.security.Principal;
2018-01-31 16:39:16 +01:00
import eu.eudat.security.claims.ClaimedAuthorities;
2018-03-05 17:18:45 +01:00
import eu.eudat.services.operations.AuthenticationService;
import eu.eudat.services.operations.AuthenticationServiceImpl;
2018-01-31 16:39:16 +01:00
import eu.eudat.types.Authorities;
2017-12-15 17:57:41 +01:00
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
2018-01-31 16:39:16 +01:00
import java.lang.annotation.Annotation;
2018-02-16 11:34:02 +01:00
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
2018-01-31 16:39:16 +01:00
2018-02-01 10:08:06 +01:00
2017-12-15 17:57:41 +01:00
public final class PrincipalArgumentResolver implements HandlerMethodArgumentResolver {
2017-12-18 16:55:12 +01:00
private AuthenticationService authenticationService;
2018-01-10 17:05:23 +01:00
2017-12-15 17:57:41 +01:00
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType().equals(Principal.class);
}
@Override
2018-01-10 17:05:23 +01:00
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
2017-12-18 16:55:12 +01:00
String token = nativeWebRequest.getHeader("AuthToken");
2018-01-31 16:39:16 +01:00
Optional<Annotation> claimsAnnotation = Arrays.stream(methodParameter.getParameterAnnotations()).filter(annotation -> annotation.annotationType().equals(ClaimedAuthorities.class)).findAny();
List<Authorities> claimList = claimsAnnotation.map(annotation -> Arrays.asList(((ClaimedAuthorities) annotation).claims())).orElse(Authorities.all());
2018-01-10 17:05:23 +01:00
if (token == null) throw new UnauthorisedException("Authentication Information Is Missing");
2017-12-18 16:55:12 +01:00
UUID authToken;
2018-01-10 17:05:23 +01:00
try {
2017-12-18 16:55:12 +01:00
authToken = UUID.fromString(token);
2018-01-10 17:05:23 +01:00
} catch (IllegalArgumentException ex) {
2017-12-18 16:55:12 +01:00
throw new UnauthorisedException("Authentication Information Is Missing");
}
Principal principal = this.authenticationService.Touch(authToken);
2018-01-10 17:05:23 +01:00
if (principal == null) throw new UnauthorisedException("Authentication Information Missing");
2018-02-16 11:34:02 +01:00
if (!principal.isAuthorized(claimList))
throw new UnauthorisedException("You are not Authorized For this Action");
2017-12-15 17:57:41 +01:00
return principal;
}
2018-01-10 17:05:23 +01:00
public PrincipalArgumentResolver(AuthenticationService authenticationService) {
2017-12-18 16:55:12 +01:00
this.authenticationService = authenticationService;
}
2017-12-15 17:57:41 +01:00
}