Как сделать аутентификацию URL в Struts2 - PullRequest
0 голосов
/ 10 июня 2010

Я использую Struts2.1.6 + Spring 2.5. В моем приложении четыре модуля.

  1. Модуль регистрации
  2. Административный модуль
  3. Цитировать модуль
  4. Модуль определения местоположения.

В модуле регистрации клиент может зарегистрироваться самостоятельно, и только после регистрации он должен иметь доступ к остальным трем модулям.

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

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

Пожалуйста, предложите, как это сделать, и, если возможно, добавьте несколько предложений кода.

Вот мой struts.xml файл (Struts.xml содержит четыре различных файла конфигурации, принадлежащих каждому модулю):

    <struts>
    <include file="struts-default.xml" />
    <constant name="struts.i18n.reload" value="false" />
    <constant name="struts.objectFactory" value="spring" />
    <constant name="struts.devMode" value="false" />
    <constant name="struts.serve.static.browserCache" value="false" />
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.multipart.maxSize" value="10000000" />
    <constant name="struts.multipart.saveDir" value="C:/Temporary_image_location" />

    <include file="/com/action/mappingFiles/registration_config.xml" />
    <include file="/com/action/mappingFiles/admin_config.xml" />
    <include file="/com/action/mappingFiles/quote.xml" />
    <include file="/com/action/mappingFiles/location_config.xml" />

</struts>

Пример registration_config.xml Файл:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="registration" extends="struts-default"
        namespace="/my_company">

        <action name="LoginView" class="registration" method="showLoginView">
            <result>....</result>
            <result name="input">...</result>
        </action>
         </package>
</struts>

Пример admin_config.xml Файл:

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
        <package name="admin" extends="struts-default"
            namespace="/my_company">

            <action name="viewAdmin" class="admin" method="showAdminView">
                <result>....</result>
                <result name="input">...</result>
            </action>
             </package>
    </struts>

Такой же код есть в остальных двух конфигурационных файлах struts2 xml. Я использовал одно и то же пространство имен во всех четырех конфигурационных файлах с разными именами пакетов (как вы можете видеть)

1 Ответ

0 голосов
/ 10 июня 2010

Примечание: стандартная практика заключается в использовании разных пространств имен для каждого пакета, например "/ my_company / admin" для пакета администратора и т. д.

Использование перехватчиков - правильный подход: он отделяет аутентификацию от самих действий. Вы можете определить два разных стека перехватчиков, один из которых требует входа пользователя в систему, а другой - нет. Начните с копирования стека перехватчиков из struts-default.xml, а затем настройте его в соответствии с вашими требованиями. Эти определения могут быть помещены в абстрактный базовый пакет:

<package name="my-base" abstract="true" extends="struts-default">
    <interceptors>
        <interceptor-stack name="login-required">
            <interceptor-ref name="exception"/>
            <interceptor-ref name="alias"/>
            <!-- etc -->
        </interceptor-stack>
        <interceptor-stack name="login-not-required">
            <!-- etc -->
        </interceptor-stack>
    </interceptors>
</package>

Тогда остальные ваши пакеты просто должны расширить этот базовый пакет:

<package name="admin" extends="my-base" namespace="/my_company/admin">
    <default-interceptor-ref name="login-required"/>

    <!-- actions defined here -->
</package>
...