Сейчас: решено - больше не воспроизводится
Для некоторых конкретных приложений безопасности у меня есть следующая функция createQuery для таблицы, т.е. вы можете получить доступ к записи таблицы, только если у вас есть учетные данные «Администратор» или вы являетесь пользователем, который хранится в отношении MembershipDelegate.
class OrganisationTable extends Doctrine_Table
function createQuery($alias = ''){
if (!$alias){
$alias = 'o';
}
$query = parent::createQuery($alias);
try {
$user = sfContext::getInstance()->getUser();
}catch(Exception $e){
if ($e->getMessage() == 'The "default" context does not exist.'){
return $query;
}else{
throw $e;
}
}
if ($user->hasCredential('Administrator')){
//all good
}else{
$userId = $user->getAttribute('userId');
print "<!--testaa ".print_r($user->getCredentials(),1).'-->';
$query->
leftJoin("$alias.MembershipDelegate mdelsec")->
addWhere ("mdelsec.joomla_user_id=$userId");
}
return $query;
}
Кажется, это работает нормально на всех уровнях, однако есть валидатор выбора, для которого объект $ user, кажется, возвращается пустым
/**
* Person form base class.
*
*/
...
abstract class BasePersonForm extends BaseFormDoctrine
{
public function setup()
{
$this->setWidgets(array(
...
'organisation_id' => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('Organisation'), 'add_empty' => true)),
class PersonForm extends BasePersonForm{
public function configure(){
$this->widgetSchema['organisation_id']->setOption('renderer_class', 'sfWidgetFormDoctrineJQueryAutocompleter');
$this->widgetSchema['organisation_id']->setOption('renderer_options', array(
'model' => 'Organisation',
'url' => NZGBCTools::makeUriJoomlaCompatible(
sfContext::getInstance()->getController()->genUrl('organisation/jsonList'))
));
$this->validatorSchema['organisation_id']->setOption('required',false);
есть ли другой способ получить объект пользователя в модели?
Этот подход к защите на уровне строк может не соответствовать MVC, но является IMO более безопасным и более эффективным, чем реализация тех же концепций безопасности в действиях:
- Может использоваться с готовыми модулями администратора-генератора.
- Гораздо сложнее забыть реализовать его где-нибудь
- Временами может не потребоваться никаких учетных данных, только доступ с правами супер администратора