There isn't a clean interface to do that, but the following hack works well in any Magento version.
First declare an observer for the sales_quote_collect_totals_before
event.
<config>
<global>
<events>
<sales_quote_collect_totals_before>
<observers>
<your_module>
<type>singleton</type>
<class>your_module/observer</class>
<method>salesQuoteCollectTotalsBefore</method>
</your_module>
</observers>
</sales_quote_collect_totals_before>
</events>
</global>
</config>
Then, in the observer, adjust the handling type and fee configuration for each carrier in the corresponding store model.
public function salesQuoteCollectTotalsBefore(Varien_Event_Observer $observer)
{
/** @var Mage_Sales_Model_Quote $quote */
$quote = $observer->getQuote();
// Check your customer attribute of choice here instead of the customer id
if ($quote->getCustomer()->getId()) {
$store = Mage::app()->getStore($quote->getStoreId());
$carriers = Mage::getStoreConfig('carriers', $store);
foreach ($carriers as $carrierCode => $carrierConfig) {
// F for fixed, P for percentage
$store->setConfig("carriers/{$carrierCode}/handling_type", 'F');
// 0 for no fee, otherwise fixed of percentage value
$store->setConfig("carriers/{$carrierCode}/handling_fee", '1');
}
}
}
Note that the configuration changes are not saved, they are only valid during the request. But because they are applied before the totals are collected, they will be taken into account whenever the shipping rates are calculated.