ProviderAuthFilter implements Filter { @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { URL url = invoker.getUrl(); boolean shouldAuth = url.getParameter(Constants.SERVICE_AUTH, false); if (shouldAuth) { Authenticator authenticator = ExtensionLoader.getExtensionLoader(Authenticator.class) .getExtension(url.getParameter(Constants.AUTHENTICATOR, Constants.DEFAULT_AUTHENTICATOR)); try { authenticator.authenticate(invocation, url); } catch (Exception e) { return AsyncRpcResult.newDefaultAsyncResult(e, invocation); } } return invoker.invoke(invocation); }  @Override Result invoke(Invoker<?> invoker, Invocation invocation);  }
@Test void testAuthDisabled() { URL url = mock(URL.class); Invoker invoker = mock(Invoker.class); Invocation invocation = mock(Invocation.class); when(invoker.getUrl()).thenReturn(url); ProviderAuthFilter providerAuthFilter = new ProviderAuthFilter(); providerAuthFilter.invoke(invoker, invocation); verify(url, never()).getParameter(eq(Constants.AUTHENTICATOR), eq(Constants.DEFAULT_AUTHENTICATOR)); }
@Test void testAuthEnabled() { URL url = URL.valueOf("dubbo: .addParameter(Constants.ACCESS_KEY_ID_KEY, "ak") .addParameter(Constants.SECRET_ACCESS_KEY_KEY, "sk") .addParameter(CommonConstants.APPLICATION_KEY, "test") .addParameter(Constants.SERVICE_AUTH, true); Invoker invoker = mock(Invoker.class); Invocation invocation = mock(Invocation.class); when(invoker.getUrl()).thenReturn(url); ProviderAuthFilter providerAuthFilter = new ProviderAuthFilter(); providerAuthFilter.invoke(invoker, invocation); verify(invocation, atLeastOnce()).getAttachment(anyString()); }
@Test void testAuthFailed() { URL url = URL.valueOf("dubbo: .addParameter(Constants.ACCESS_KEY_ID_KEY, "ak") .addParameter(Constants.SECRET_ACCESS_KEY_KEY, "sk") .addParameter(CommonConstants.APPLICATION_KEY, "test") .addParameter(Constants.SERVICE_AUTH, true); Invoker invoker = mock(Invoker.class); Invocation invocation = mock(Invocation.class); when(invocation.getAttachment(Constants.REQUEST_SIGNATURE_KEY)).thenReturn(null); when(invoker.getUrl()).thenReturn(url); ProviderAuthFilter providerAuthFilter = new ProviderAuthFilter(); Result result = providerAuthFilter.invoke(invoker, invocation); assertTrue(result.hasException()); }
@Test void testAuthFailedWhenNoSignature() { URL url = URL.valueOf("dubbo: .addParameter(Constants.ACCESS_KEY_ID_KEY, "ak") .addParameter(Constants.SECRET_ACCESS_KEY_KEY, "sk") .addParameter(CommonConstants.APPLICATION_KEY, "test") .addParameter(Constants.SERVICE_AUTH, true); Invoker invoker = mock(Invoker.class); Invocation invocation = mock(Invocation.class); when(invocation.getAttachment(Constants.REQUEST_SIGNATURE_KEY)).thenReturn(null); when(invoker.getUrl()).thenReturn(url); ProviderAuthFilter providerAuthFilter = new ProviderAuthFilter(); Result result = providerAuthFilter.invoke(invoker, invocation); assertTrue(result.hasException()); }
@Test void testAuthFailedWhenNoAccessKeyPair() { URL url = URL.valueOf("dubbo: .addParameter(CommonConstants.APPLICATION_KEY, "test-provider") .addParameter(Constants.SERVICE_AUTH, true); Invoker invoker = mock(Invoker.class); Invocation invocation = mock(Invocation.class); when(invocation.getObjectAttachment(Constants.REQUEST_SIGNATURE_KEY)).thenReturn("dubbo"); when(invocation.getObjectAttachment(Constants.AK_KEY)).thenReturn("ak"); when(invocation.getObjectAttachment(CommonConstants.CONSUMER)).thenReturn("test-consumer"); when(invocation.getObjectAttachment(Constants.REQUEST_TIMESTAMP_KEY)).thenReturn(System.currentTimeMillis()); when(invoker.getUrl()).thenReturn(url); ProviderAuthFilter providerAuthFilter = new ProviderAuthFilter(); Result result = providerAuthFilter.invoke(invoker, invocation); assertTrue(result.hasException()); assertTrue(result.getException() instanceof RpcAuthenticationException); }
@Test void testAuthFailedWhenParameterError() { String service = "org.apache.dubbo.DemoService"; String method = "test"; Object[] originalParams = new Object[]{"dubbo1", "dubbo2"}; long currentTimeMillis = System.currentTimeMillis(); URL url = URL.valueOf("dubbo: .setServiceInterface(service) .addParameter(Constants.ACCESS_KEY_ID_KEY, "ak") .addParameter(Constants.SECRET_ACCESS_KEY_KEY, "sk") .addParameter(CommonConstants.APPLICATION_KEY, "test-provider") .addParameter(Constants.PARAMETER_SIGNATURE_ENABLE_KEY, true) .addParameter(Constants.SERVICE_AUTH, true); Invoker invoker = mock(Invoker.class); Invocation invocation = mock(Invocation.class); when(invocation.getObjectAttachment(Constants.AK_KEY)).thenReturn("ak"); when(invocation.getObjectAttachment(CommonConstants.CONSUMER)).thenReturn("test-consumer"); when(invocation.getObjectAttachment(Constants.REQUEST_TIMESTAMP_KEY)).thenReturn(currentTimeMillis); when(invocation.getMethodName()).thenReturn(method); Object[] fakeParams = new Object[]{"dubbo1", "dubbo3"}; when(invocation.getArguments()).thenReturn(fakeParams); when(invoker.getUrl()).thenReturn(url); String requestString = String.format(Constants.SIGNATURE_STRING_FORMAT, url.getColonSeparatedKey(), invocation.getMethodName(), "sk", currentTimeMillis); String sign = SignatureUtils.sign(originalParams, requestString, "sk"); when(invocation.getObjectAttachment(Constants.REQUEST_SIGNATURE_KEY)).thenReturn(sign); ProviderAuthFilter providerAuthFilter = new ProviderAuthFilter(); Result result = providerAuthFilter.invoke(invoker, invocation); assertTrue(result.hasException()); assertTrue(result.getException() instanceof RpcAuthenticationException); }
@Test void testAuthSuccessfully() { String service = "org.apache.dubbo.DemoService"; String method = "test"; long currentTimeMillis = System.currentTimeMillis(); URL url = URL.valueOf("dubbo: .setServiceInterface(service) .addParameter(Constants.ACCESS_KEY_ID_KEY, "ak") .addParameter(Constants.SECRET_ACCESS_KEY_KEY, "sk") .addParameter(CommonConstants.APPLICATION_KEY, "test-provider") .addParameter(Constants.SERVICE_AUTH, true); Invoker invoker = mock(Invoker.class); Invocation invocation = mock(Invocation.class); when(invocation.getAttachment(Constants.AK_KEY)).thenReturn("ak"); when(invocation.getAttachment(CommonConstants.CONSUMER)).thenReturn("test-consumer"); when(invocation.getAttachment(Constants.REQUEST_TIMESTAMP_KEY)).thenReturn(String.valueOf(currentTimeMillis)); when(invocation.getMethodName()).thenReturn(method); when(invoker.getUrl()).thenReturn(url); String requestString = String.format(Constants.SIGNATURE_STRING_FORMAT, url.getColonSeparatedKey(), invocation.getMethodName(), "sk", currentTimeMillis); String sign = SignatureUtils.sign(requestString, "sk"); when(invocation.getAttachment(Constants.REQUEST_SIGNATURE_KEY)).thenReturn(sign); ProviderAuthFilter providerAuthFilter = new ProviderAuthFilter(); Result result = providerAuthFilter.invoke(invoker, invocation); assertNull(result); }