diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/BaseController.java b/application/src/main/java/com/indiscale/fdo/manager/service/BaseController.java index 4db49832286867f315f6d115b355e420cbcd6c7f..58b5dc60ab08395c48abd97893f80443539ab8ea 100644 --- a/application/src/main/java/com/indiscale/fdo/manager/service/BaseController.java +++ b/application/src/main/java/com/indiscale/fdo/manager/service/BaseController.java @@ -6,7 +6,8 @@ import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; import com.indiscale.fdo.manager.api.Manager; import com.indiscale.fdo.manager.service.api.model.Error; import com.indiscale.fdo.manager.service.api.model.Links; -import com.indiscale.fdo.manager.service.authentication.AuthToken; +import com.indiscale.fdo.manager.service.authentication.Authenticator; +import com.indiscale.fdo.manager.service.authentication.AuthenticatorProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.http.ResponseEntity; @@ -18,7 +19,7 @@ public class BaseController { @Autowired ManagerPool managerPool; - @Autowired AuthToken authToken; + @Autowired AuthenticatorProvider authenticator; @Autowired OperationsLoggerFactory operationsLoggerFactory; @@ -35,8 +36,8 @@ public class BaseController { return managerPool.getManager(); } - protected String getToken() { - return authToken.getToken(); + protected Authenticator getAuthenticator() { + return authenticator.getAuthenticator(); } @ExceptionHandler(ResponseStatusException.class) diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/HeaderInterceptorConfig.java b/application/src/main/java/com/indiscale/fdo/manager/service/HeaderInterceptorConfig.java index ecc56055298446c748274174d249dc2638c835b7..868131bf54b3590a28f52e32e13ee1c24b467402 100644 --- a/application/src/main/java/com/indiscale/fdo/manager/service/HeaderInterceptorConfig.java +++ b/application/src/main/java/com/indiscale/fdo/manager/service/HeaderInterceptorConfig.java @@ -1,7 +1,7 @@ package com.indiscale.fdo.manager.service; -import com.indiscale.fdo.manager.service.authentication.AuthToken; -import com.indiscale.fdo.manager.service.authentication.AuthTokenInterceptor; +import com.indiscale.fdo.manager.service.authentication.AuthenticationInterceptor; +import com.indiscale.fdo.manager.service.authentication.AuthenticatorProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; @@ -15,17 +15,17 @@ public class HeaderInterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(final InterceptorRegistry registry) { - registry.addInterceptor(authTokenInterceptor()); + registry.addInterceptor(authenticationInterceptor()); } @Bean - AuthTokenInterceptor authTokenInterceptor() { - return new AuthTokenInterceptor(authToken()); + AuthenticationInterceptor authenticationInterceptor() { + return new AuthenticationInterceptor(authenticator()); } @Bean @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) - AuthToken authToken() { - return new AuthToken(); + AuthenticatorProvider authenticator() { + return new AuthenticatorProvider(); } } diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthToken.java b/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthToken.java deleted file mode 100644 index 0f0f36d8a513b285c8a527efec502725af6c3b8b..0000000000000000000000000000000000000000 --- a/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthToken.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.indiscale.fdo.manager.service.authentication; - -public class AuthToken { - - private String token; - - public void setToken(String token) { - this.token = token; - } - - public String getToken() { - return token; - } - - @Override - public String toString() { - return "AuthToken[" + token + "]"; - } -} diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthTokenInterceptor.java b/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthenticationInterceptor.java similarity index 56% rename from application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthTokenInterceptor.java rename to application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthenticationInterceptor.java index c0adfe091d3a2bcc91bf0b4668a231e93be5a890..0dd8e204ff3ead155df7614071b4877ce38a1a3d 100644 --- a/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthTokenInterceptor.java +++ b/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthenticationInterceptor.java @@ -8,26 +8,28 @@ import org.springframework.context.annotation.ScopedProxyMode; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.HandlerInterceptor; -public class AuthTokenInterceptor implements HandlerInterceptor { - private final AuthToken authToken; +public class AuthenticationInterceptor implements HandlerInterceptor { + private AuthenticatorProvider authenticator; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - String header = request.getHeader("authentication"); + String header = request.getHeader("authorization"); if (header != null && header.startsWith("Bearer ")) { - authToken.setToken(header.substring(7)); + authenticator.setAuthenticator(new AuthenticationToken(header.substring(7))); + } else if (header != null && header.startsWith("Basic ")) { + authenticator.setAuthenticator(new BasicCredentials(header.substring(6))); } return true; } - public AuthTokenInterceptor(AuthToken authToken) { - this.authToken = authToken; + public AuthenticationInterceptor(AuthenticatorProvider authenticator) { + this.authenticator = authenticator; } @Bean @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) - AuthToken authToken() { - return new AuthToken(); + AuthenticatorProvider authenticator() { + return new AuthenticatorProvider(); } } diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthenticationToken.java b/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthenticationToken.java new file mode 100644 index 0000000000000000000000000000000000000000..023bfe4e8b81fbf5e0f710e889628a553d70ebda --- /dev/null +++ b/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthenticationToken.java @@ -0,0 +1,23 @@ +package com.indiscale.fdo.manager.service.authentication; + +import com.indiscale.fdo.manager.api.RepositoryConnection; +import com.indiscale.fdo.manager.api.TokenAuthenticationInfo; + +public class AuthenticationToken implements Authenticator { + + public AuthenticationToken(String token) { + this.token = token; + } + + private String token; + + @Override + public String toString() { + return "AuthToken[" + token + "]"; + } + + @Override + public void authenticateWith(RepositoryConnection repository) { + repository.setTokenAuthenticationInfo(new TokenAuthenticationInfo(token)); + } +} diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/authentication/Authenticator.java b/application/src/main/java/com/indiscale/fdo/manager/service/authentication/Authenticator.java new file mode 100644 index 0000000000000000000000000000000000000000..dff360a46e9946d8fb3bcab1efd10ab731a1c60a --- /dev/null +++ b/application/src/main/java/com/indiscale/fdo/manager/service/authentication/Authenticator.java @@ -0,0 +1,7 @@ +package com.indiscale.fdo.manager.service.authentication; + +import com.indiscale.fdo.manager.api.RepositoryConnection; + +public interface Authenticator { + public void authenticateWith(RepositoryConnection repository); +} diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthenticatorProvider.java b/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthenticatorProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..9459d1d0e6922be937befdeb0e6f449a18cd7487 --- /dev/null +++ b/application/src/main/java/com/indiscale/fdo/manager/service/authentication/AuthenticatorProvider.java @@ -0,0 +1,13 @@ +package com.indiscale.fdo.manager.service.authentication; + +public class AuthenticatorProvider { + private Authenticator authenticator; + + public Authenticator getAuthenticator() { + return authenticator; + } + + public void setAuthenticator(Authenticator authenticator) { + this.authenticator = authenticator; + } +} diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/authentication/BasicCredentials.java b/application/src/main/java/com/indiscale/fdo/manager/service/authentication/BasicCredentials.java new file mode 100644 index 0000000000000000000000000000000000000000..be566f0a0e6e4cca30ccd5d523b6e1b5a7eb4407 --- /dev/null +++ b/application/src/main/java/com/indiscale/fdo/manager/service/authentication/BasicCredentials.java @@ -0,0 +1,30 @@ +package com.indiscale.fdo.manager.service.authentication; + +import com.indiscale.fdo.manager.api.CredentialsAuthenticationInfo; +import com.indiscale.fdo.manager.api.RepositoryConnection; +import java.util.Base64; + +public class BasicCredentials implements Authenticator { + + private String username; + private String password; + + private static String[] decodeAndSplit(String encoded) { + return new String(Base64.getDecoder().decode(encoded.getBytes())).split(":", 2); + } + + public BasicCredentials(String encoded) { + this(decodeAndSplit(encoded)); + } + + private BasicCredentials(String... components) { + this.username = components[0]; + this.password = components[1]; + } + + @Override + public void authenticateWith(RepositoryConnection repository) { + repository.setCredentialsAuthenticationInfo( + new CredentialsAuthenticationInfo(username, password)); + } +} diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java b/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java index c2943b358e414dabb39ddfc3a081878f164b2a0c..cb81440a774ae961eeb9a6852734bb451229fb52 100644 --- a/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java +++ b/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java @@ -18,7 +18,6 @@ import com.indiscale.fdo.manager.api.Manager; import com.indiscale.fdo.manager.api.MetadataProfile; import com.indiscale.fdo.manager.api.PidUnresolvableException; import com.indiscale.fdo.manager.api.RepositoryConnection; -import com.indiscale.fdo.manager.api.TokenAuthenticationInfo; import com.indiscale.fdo.manager.api.UnknownRepositoryException; import com.indiscale.fdo.manager.api.ValidationException; import com.indiscale.fdo.manager.service.BaseController; @@ -109,8 +108,8 @@ public class FDOApiImpl extends BaseController implements FdoApi { try (Manager manager = getManager()) { RepositoryConnection repository = manager.getRepositoryRegistry().createRepositoryConnection(repositories.getFdo()); - if (getToken() != null && !getToken().isBlank()) { - repository.setTokenAuthenticationInfo(new TokenAuthenticationInfo(getToken())); + if (getAuthenticator() != null) { + getAuthenticator().authenticateWith(repository); } FdoProfile profile = manager.getDefaultProfile(); Data data = null; diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/hello/InfoImpl.java b/application/src/main/java/com/indiscale/fdo/manager/service/hello/InfoImpl.java index 8e95008a6841d87b67c2e4a5b3196c70e3567bae..c142c88647edf22356e4c6453946d1f08ca0e52d 100644 --- a/application/src/main/java/com/indiscale/fdo/manager/service/hello/InfoImpl.java +++ b/application/src/main/java/com/indiscale/fdo/manager/service/hello/InfoImpl.java @@ -4,8 +4,6 @@ import com.indiscale.fdo.manager.service.BaseController; import com.indiscale.fdo.manager.service.api.model.GetInfo200Response; import com.indiscale.fdo.manager.service.api.model.Info; import com.indiscale.fdo.manager.service.api.operation.InfoApi; -import com.indiscale.fdo.manager.service.authentication.AuthToken; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; @@ -15,8 +13,6 @@ import org.springframework.web.bind.annotation.RestController; @CrossOrigin(origins = {"${react-dev-server}"}) public class InfoImpl extends BaseController implements InfoApi { - @Autowired AuthToken authToken; - @Value("${fdo.service.version}") private String fdoServiceVersion; @@ -25,7 +21,6 @@ public class InfoImpl extends BaseController implements InfoApi { @Override public ResponseEntity<GetInfo200Response> getInfo() { - System.out.println("authToken: " + authToken); Info data = new Info().fdoServiceVersion(fdoServiceVersion).fdoSdkVersion(fdoSdkVersion); return ResponseEntity.ok(new GetInfo200Response(data)); }