Как я могу использовать/получать доступ к переменным SESSION в удаленном методе CFC ColdFusion?

У меня есть несколько методов в CFC, доступ к которым осуществляется удаленно через JavaScript. Некоторые из этих методов используют переменные SESSION, чтобы определить, какую логику запускать и, следовательно, какие данные возвращать.

Например, предположим, что я установил переменную SESSION при входе в систему с именем SESSION.IsMale.

В моем удаленном методе CFC я запускаю следующий код:

<cffunction name="getFavoriteColor" access="remote" returntype="String">
    <cfif SESSION.IsMale>
        <cfreturn "blue" />
    </cfif>

    <cfreturn "pink" />
</cffunction>

Теперь я не хочу напрямую обращаться к области SESSION в моем CFC. Итак, как я могу «получить доступ» к области SESSION при вызове этого метода с использованием AJAX.

Я не хочу хранить значения на странице как глобальные переменные JavaScript, так как это противоречит цели обеспечения их безопасности.


person Eric Belair    schedule 24.10.2011    source источник
comment
Я просто хотел бы заявить, что приведенный выше пример является ЧРЕЗВЫЧАЙНО упрощенным псевдокодом. Возможно, мои методы обращаются к нескольким переменным SESSION в разных точках.   -  person Eric Belair    schedule 25.10.2011
comment
Почему я не хочу напрямую обращаться к области SESSION в моем CFC? а где вопрос?   -  person Henry    schedule 25.10.2011
comment
@ Генри, потому что это нарушает инкапсуляцию.   -  person Shawn Holmes    schedule 25.10.2011
comment
Я не думаю, что это связано с инкапсуляцией. Я думаю, что правило KISS имеет приоритет над этим в данном случае. И если я забочусь о тестируемости, я могу просто использовать cfargument sess по умолчанию для #Session#   -  person Henry    schedule 25.10.2011
comment
Я не согласен с Генри. Нарушение инкапсуляции по-прежнему плохо, поскольку делает ваше приложение менее удобным в сопровождении. Создание области сеанса в качестве аргумента по умолчанию может решить эту проблему (едва ли), но у вас все еще будет проблема разделения проблем. Ваш компонент не должен заботиться о своей безопасности, он должен заботиться о том, чтобы быть тем, чем он является. Вот где вам действительно могут помочь ColdSpring, удаленные прокси и АОП. Вы можете защитить свои компоненты и методы, вообще не помещая в эти методы какой-либо защитный код. Оно отделилось.   -  person Jason Dean    schedule 26.10.2011
comment
Я упускаю очевидное? Если вы не хотите нарушать инкапсуляцию, почему бы просто не передать переменную сеанса в вашу функцию при ее вызове?   -  person Limey    schedule 26.10.2011
comment
Потому что он звонит удаленно, как из Ajax-запроса.   -  person Jason Dean    schedule 26.10.2011


Ответы (2)


Лучший ответ, который я могу предложить, — это рассмотреть возможность использования ColdSpring для создания удаленных прокси-серверов и создания перехватчиков AOP для обработки проверки.

Это намного проще, чем кажется.

Я рассказываю об этом в своей презентации Securing Ajax здесь: http://www.12robots.com/index.cfm/2010/8/19/My-Presentations-slides-from-cfObjective-NCDevCon-and-CFUnited.

Подробнее об этом можно узнать в документации по ColdSpring здесь: http://www.coldspringframework.org/index.cfm/go/documentation

person Jason Dean    schedule 24.10.2011

К совету Джейсона всегда стоит прислушаться, но если ColdSpring кажется вам слишком сложным, вы можете просто создать свой собственный простой удаленный прокси: CFC под вашим веб-корнем, предназначенный для ответа на удаленные вызовы ajax. Здесь вы пишете удаленные методы, которые затем будут взаимодействовать с другими CFC в вашей модели/службе (или как вы их организуете), используя их существующие API и при необходимости передавая/возвращая значения из области сеанса.

Эффект тот же: инкапсуляция сохраняется, а доступ контролируется.

person CfSimplicity    schedule 26.10.2011