今天在使用AWS中,由于原来的 key和secrect是放在配置文件ini里面的。现在需要改成从DB里面获取,所以需要自定义Credential.在AWS中重写这个挺简单的。
我这里是继承原先的CredentialProvider类,然后写了一个bucketProvider方法
使用方法:
//调用自定义provider
$provider = applibraryAwsS3CredentialProvider::bucketProvider();
$provider = AwsCredentialsCredentialProvider::memoize($provider);
try {
$s3Client = new AwsS3S3Client([
'region' => $region,
'version' => '2006-03-01',
'credentials' => $provider,
]);
}catch (AwsExceptionCredentialsException $ex){
return null;
}
<?php
namespace applibraryAws;
use YafRegistry;
use AwsCredentialsCredentialProvider;
use GuzzleHttpPromise;
use AwsExceptionCredentialsException;
use GuzzleHttpPromiseRejectedPromise;
use AwsCredentialsCredentials;
/**
* Class DB
* @package applibraryAws
* awazon 自定义credential,根椐存储桶,去获取access_id 和 access_secrect;
*/
class S3CredentialProvider extends CredentialProvider
{
public static function bucketProvider()
{
return function () {
$bucketInfo = [];
try {
$bucketInfo = applibraryAwsBucket::instance()->getBucketRegion(); //获取bucket信息。
}catch(Exception $ex){
return new PromiseRejectedPromise(new CredentialsException("获取s3认证文件失败"));
}
$accessKey = isset($bucketInfo['accessKey']) && $bucketInfo['accessKey'] ? json_decode($bucketInfo['accessKey'],true) : [];
$key = isset($accessKey['id']) && $accessKey['id'] ? $accessKey['id'] : '';
$secret = isset($accessKey['key']) && $accessKey['key'] ? $accessKey['key'] : '';
if ($key && $secret) {
return Promisepromise_for(
new Credentials($key, $secret,NULL)
);
}
return new PromiseRejectedPromise(new CredentialsException("找不到s3的key,secrect用于认证"));
};
}
}