Struts2 серьезная проблема с безопасностью?

Я работаю со struts2, hibernate и spring и использую шаблон, управляемый моделью. Кажется, что существует серьезная проблема при попытке получить объект с двумя разными пользователями и сеансами (также разными компьютерами) в одно и то же время.

Подробнее... Допустим, у нас есть объект Project, который имеет 2 члена — пользователя и имя. Оба пользователя попытаются получить свой объект Project (который, конечно, является другим объектом для разных пользователей). Таким образом, у пользователя А будет проект с идентификатором 498, а у пользователя Б — проект с идентификатором 499.

Действие struts распознает, что они пытаются получить объект с другим идентификатором, но кажется, что оба пользователя имеют один и тот же экземпляр объекта Project, и поэтому они видят один и тот же результат. Вы могли видеть в журнале, представленном здесь:

2011-12-08 14:07:21 LoginInterceptor [INFO] Пользователь 17 вызывает populateProject, параметры: id=499 2011-12-08 14:07:21 LoginInterceptor [INFO] Пользователь 4 вызывает populateProject, параметры: id=498 2011-12-08 14:07:21 ProjectAction [INFO] Obj: hbn.Project@e2df60d, идентификатор пользователя сеанса — 17, obj.user.id — 4 2011-12-08 14:07:21 ProjectAction [INFO] Obj : hbn.Project@e2df60d, идентификатор пользователя сеанса — 4, obj.user.id — 4.

Как я мог это решить?

Спасибо, Рон.


person Ron    schedule 08.12.2011    source источник
comment
как вы создаете экземпляр действия struts2 ?? Вы используете плагин struts2-spring, и если да, покажите свой файл spring, в котором вы создаете экземпляр действия?   -  person Umesh Awasthi    schedule 08.12.2011
comment
Да, я делаю это с помощью плагина struts2-spring. У меня есть отдельный файл конфигурации spring для каждого действия (или большинства из них). Это из ProjectBeans.xml ‹bean id=projectAction class=actions.ProjectAction› ‹property name=dao ref=projectDAO /› ‹/bean› ‹bean id=projectDAO class=hbn.dao.ProjectDAO› ‹property name=sessionFactory ref=sessionFactory /› ‹/bean›   -  person Ron    schedule 08.12.2011
comment
Можете ли вы показать какой-либо файл конфигурации Spring и, кроме того, какую область вы определяете для действий?   -  person Umesh Awasthi    schedule 08.12.2011
comment
Это часть конфигурационного файла spring, которая инициирует действие... Я не уверен, в какой области мне искать? Это часть файла struts.xml ‹имя действия=*метод проекта={1} class=projectAction› ‹имя результата=form›jsp/Project/form.jsp‹/результат› ‹имя результата=list›jsp/Project/list .jsp‹/result› ‹имя результата=details›jsp/Project/details.jsp‹/result› ‹имя результата=showReport›jsp/Project/showReport.jsp‹/result› ‹/action›   -  person Ron    schedule 08.12.2011
comment
хорошо. в вашем файле struts.xml вы определили class="projectAction, и этот класс projectAction должен быть инициализирован Spring в каком-то другом файле, можете ли вы показать эту запись, в которой вы создали bean-компонент, например <bean id="projectAction" class="you class" scope="">   -  person Umesh Awasthi    schedule 08.12.2011
comment
Я только что добавил этот scope = prototype - его раньше не было, и я думаю, что он решает эту проблему ... может быть?   -  person Ron    schedule 08.12.2011
comment
да, так как в struts2 для каждого запроса должен быть новый объект действия, см. мой подробный ответ ниже :)   -  person Umesh Awasthi    schedule 08.12.2011


Ответы (1)


В соответствии с обсуждением, которое у нас есть, я публикую причину проблемы и решение. Область действия не была установлена ​​для действия, создаваемого плагином Spring, и по умолчанию они имеют область действия singleton. В struts2 каждое действие также работает как объект домена, поэтому Struts2 всегда создает новый экземпляр действия для каждого запроса и помещает его в стек значений.

в приведенном выше случае область действия была singleton, и это было причиной проблемы, поскольку оба пользователя имеют один и тот же объект действия, передаваемый пружиной из-за singleton scope. Настройка scope=prototype решила проблему.

для более подробной информации обратитесь к официальной странице плагина

плагин Struts2-Spring

person Umesh Awasthi    schedule 08.12.2011
comment
Кстати, а не лучше ли хранить полученный из БД объект в сессии? потому что, насколько я понимаю, каждый тег типа ‹s:textfield name=name key=Name size=30 value=%{obj.name}/› будет создавать новый экземпляр действия (требуется доступ к методу getObj) - person Ron; 08.12.2011
comment
я предлагаю вам создать новый вопрос для этого. но не нужно помещать каждый объект в сеанс, поскольку struts2 из коробки создает стек значений и помещает туда объект запроса, чтобы оттуда можно было получить доступ - person Umesh Awasthi; 08.12.2011