@Override
  protected final void authenticateInbound(MuleEvent event)
      throws SecurityException, CryptoFailureException, EncryptionStrategyNotFoundException,
          UnknownAuthenticationTypeException {
    String userHeader = (String) getCredentialsAccessor().getCredentials(event);
    if (userHeader == null) {
      throw new CredentialsNotSetException(event, event.getSession().getSecurityContext(), this);
    }

    Credentials user = new MuleCredentials(userHeader, getSecurityManager());

    Authentication authentication;
    try {
      authentication =
          getSecurityManager().authenticate(new DefaultMuleAuthentication(user, event));
    } catch (Exception e) {
      // Authentication failed
      if (logger.isDebugEnabled()) {
        logger.debug(
            "Authentication request for user: "******" failed: " + e.toString());
      }
      throw new UnauthorisedException(CoreMessages.authFailedForUser(user.getUsername()), event, e);
    }

    // Authentication success
    if (logger.isDebugEnabled()) {
      logger.debug("Authentication success: " + authentication.toString());
    }

    SecurityContext context = getSecurityManager().createSecurityContext(authentication);
    context.setAuthentication(authentication);
    event.getSession().setSecurityContext(context);
  }
  @Override
  protected void authenticateOutbound(MuleEvent event)
      throws SecurityException, SecurityProviderNotFoundException, CryptoFailureException {
    SecurityContext securityContext = event.getSession().getSecurityContext();
    if (securityContext == null) {
      if (isAuthenticate()) {
        throw new UnauthorisedException(event, securityContext, this);
      } else {
        return;
      }
    }

    Authentication auth = securityContext.getAuthentication();
    if (isAuthenticate()) {
      auth = getSecurityManager().authenticate(auth);
      if (logger.isDebugEnabled()) {
        logger.debug("Authentication success: " + auth.toString());
      }
    }

    String token = auth.getCredentials().toString();
    String header = new String(strategy.encrypt(token.getBytes(), null));
    getCredentialsAccessor().setCredentials(event, header);
  }