Использование нескольких SessionTimeout в Coldfusion

У меня есть приложение, которое имеет разные типы пользователей. Мне нужно установить sessionTimeout на основе типа пользователя. Например, администратор 30 минут, пользователь 10 минут. Для этого я установил в application.cfc значение sessionTimeout по умолчанию, равное 30 минутам.

<cfcomponent output="false" extends="org.corfield.framework">   
    <cfset this.applicationTimeout = createTimeSpan(1,0,0,0) />
    <cfset this.sessionManagement = true />
    <cfset this.sessionTimeout = createTimeSpan(0,0,30,0) />
    .............
    ............

</cfcomponent>

Когда я выгружаю переменные приложения, я вижу, что sessionTimeout равен 600, что правильно. Теперь в методе onRequestStart я написал код для проверки типа пользователя loggedIn и соответствующей установки sessionTimeout.

<cfif StructKeyExists(session,"user") AND ListLast(CGI.HTTP_REFERER,"/") EQ "login.cfm" >
    <cfif session.user.userType EQ "GSA">
        <cfset this.sessionTimeout = createTimeSpan(0,0,10,0) />
    </cfif>
</cfif>

После этого, когда я выгружаю переменные приложения, sessionTimeout отображается в днях, а не в секундах. А также сессия не заканчивается через 10 минут. Может ли кто-нибудь помочь в этом? Как реализовать два разных sessionTimeout в приложении? Также почему он показывает sessionTimeout в днях, а не в секундах, когда я снова устанавливаю sessionTimeout?


person Vineesh    schedule 16.01.2018    source источник


Ответы (4)


Я не верю, что есть какой-либо способ изменить метаданные области this внутри одной из этих функций: onApplicationStart, onSessionStart или onRequestStart. Это означает, что вы не можете установить this.sessionTimeout ни одним из этих методов.

Недавно я изучал этот ColdFusion 11. : изменение метаданных Application this Scope из разных функций в расширенном Application.cfc. Однако метаданные устанавливаются для каждого запроса, сделанного ColdFusion. Это означает, что вы можете попробовать подход, подобный упомянутому в этой статье Беном Наделем, и переместить логику, устанавливающую тайм-аут, из onRequest() в область this и попытаться создать динамические тайм-ауты сеанса.

Отсрочка сохранения сеанса ColdFusion до тех пор, пока пользователь Вход

Вам, вероятно, придется проявить творческий подход, чтобы выяснить, какой пользователь входит в систему в этот момент. (Даже если аутентификация происходит позже... есть ли вред от установки тайм-аута?)

person Hedge7707    schedule 16.01.2018

Тайм-ауты сеанса являются общими для всех пользователей. Продолжительность тайм-аута устанавливается для всего приложения при поступлении первого запроса.

Я думаю, что короткий ответ таков: вы не можете установить две разные продолжительности тайм-аута сеанса.

person James A Mohler    schedule 16.01.2018
comment
Есть ли какие-то настройки, которые я могу сделать, чтобы добиться этого? - person Vineesh; 16.01.2018
comment
По-настоящему ужасным способом сделать это было бы установить переменную в области видимости session, а также проверять и обновлять эту переменную при каждом запросе. Затем вам нужно будет создать собственную проверку сеанса. ОТ: Когда меня просят создать что-то, что делает систему менее функциональной, я обычно сопротивляюсь. От чего вы пытаетесь защититься? И как это должно решить любую проблему, которая, по вашему мнению, может существовать? - person James A Mohler; 16.01.2018
comment
Это было требование клиента, я пытался выяснить, доступно ли какое-либо решение, иначе я смогу их убедить. - person Vineesh; 16.01.2018
comment
Я знаю, что вы используете FW/1. Если вся безопасность так или иначе обрабатывается в application.cfc, тогда вы в хорошей форме, и у нее будет LOE. OTOH, вы должны учитывать, что эти session могут быть хороши с точки зрения CF, НО недействительны с точки зрения вашей бизнес-логики. - person James A Mohler; 16.01.2018

Вот один из методов, который вы можете использовать. Это своего рода создание вашей собственной клиентской части управления сеансом, но это позволяет настраивать время ожидания сеанса для каждой роли пользователя. Создайте временную метку в области сеанса, которая изначально настроена на текущее время входа пользователя в ваше приложение. В клиентском JavaScript вашего приложения создайте таймер, который вызывает функцию каждую минуту или около того, которая, в свою очередь, вызывает функцию на стороне сервера, чтобы увидеть, сколько времени прошло с момента последней записанной метки времени для этого пользователя. Если прошедшее время достигает максимально допустимого для роли этого пользователя, используйте функцию JavaScript для выхода пользователя из системы.
С помощью этого метода вы сбрасываете метку времени каждый раз, когда пользователь «взаимодействует» с приложением (запускает скрипт, вызывает cfc функция библиотеки и т. д.), чтобы пользователь не вышел из системы во время активного использования приложения. Пользователь выходит из системы только после «x» минут бездействия, которое вы определяете, и функция, которую вы вызываете на стороне сервера, может дополнительно определить, что это за число для каждой роли пользователя.

person Jeff    schedule 18.01.2018

Я использовал это в рейло, но я думаю, что это применимо и к холодному синтезу.

getPageContext().getSession().setMaxInactiveInterval(javaCast("int", 60));

В основном он устанавливает значение времени ожидания сеанса для текущего запроса на 60 с чем-то (я не могу вспомнить, в минутах или секундах)

person Snipzwolf    schedule 21.01.2018