Spring безопасность с несколькими страницами входа

Я использую Spring безопасность для обеспечения входа в раздел администрирования приложения с именем пользователя и паролем. Но теперь моему клиенту необходимо иметь другой экран для входа в раздел клиентских приложений, где у них будут свои собственные имена пользователей/пароли для входа в раздел клиентов. До сих пор я уже успешно выполнил вход в админку с помощью следующих параметров spring -security.xml:

<security:http auto-config="true" use-expressions="true">
    <security:form-login login-page="/login"
        default-target-url="/admin/dashboard" always-use-default-target="true"
        authentication-failure-url="/login/admin?error_msg=wrong username or password" />
    <security:intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')" />        
    <security:logout logout-success-url="/login"/>
</security:http>

<security:authentication-manager>
    <security:authentication-provider
        user-service-ref="adminServiceImpl">
    </security:authentication-provider>
</security:authentication-manager>

Я много искал в Интернете, пытаясь найти, как я могу добавить экран входа в клиентский раздел, intercept-url (s), поставщика проверки подлинности безопасности, но не смог найти никакой информации, так что кто-то может помочь мне с любым ссылку на любой учебник/пример, руководство по тому, как это сделать?

Спасибо

Ответ 1

В соответствии с Spring Документация по безопасности:

Из Spring Security 3.1 теперь можно использовать несколько http элементов для определения отдельных конфигураций цепочек фильтров безопасности для различные шаблоны запросов. Если атрибут pattern опущен http-элемент, он соответствует всем запросам.

Каждый элемент создает цепочку фильтров внутри внутреннего фильтра FilterChainProxy и шаблон URL, который должен быть сопоставлен с ним. Элементы будут добавлены в том порядке, в котором они объявлены, поэтому сначала должны быть объявлены наиболее конкретные шаблоны.

Итак, по существу вам нужны два <http>, каждый из которых имеет другой атрибут pattern.

Здесь есть подробный учебник: https://blog.codecentric.de/en/2012/07/spring-security-two-security-realms-in-one-application/

Ответ 2

Я бы использовал только один security:http, но зарегистрировал два UsernamePasswordLoginFilter s.

Это решение было бы уместно, если бы два логина Login-Pages были в той же области безопасности. (Так что, если неважно, на какой странице входа в систему пользователь входит в систему). Конечно, вы все равно можете использовать роли, чтобы ограничить доступ для разных частей вашего приложения для разных типов пользователей.

Это решение должно быть довольно простым, потому что вам не нужно обрабатывать два раздела security:http.

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

Ответ 3

Пример проекта Spring MVC-приложения с несколькими форматами входа.

Три типа страниц Normal/Member/Admin. Если вы попытаетесь получить доступ к странице участника, вы попадете в форму входа в систему. Если вы попытаетесь получить доступ к странице администратора, перейдите в форму входа администратора.

https://github.com/eric-mckinley/springmultihttploginforms

Выполняется с помощью ant -регрессивного запроса-запроса в файле конфигурации xml файла seucrity.

<beans:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:beans="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/security
                http://www.springframework.org/schema/security/spring-security.xsd">

<global-method-security secured-annotations="enabled" />

<http name="member" pattern="/member/*" request-matcher="ant"   auto-config="true" use-expressions="false">
    <csrf disabled="true"/>

    <intercept-url pattern="/member/home" access="ROLE_MEMBER" />
    <intercept-url pattern="/member/account" access="ROLE_MEMBER" />
    <intercept-url pattern="/member/orders" access="ROLE_MEMBER" />

    <form-login login-page="/member-login" always-use-default-target="false"/>
    <logout logout-url="/logout" logout-success-url="/home"/>
</http>

<http name="admin" request-matcher="regex"   auto-config="true" use-expressions="false">
    <csrf disabled="true"/>

    <intercept-url pattern="/admin/home" access="ROLE_ADMIN" />
    <intercept-url pattern="/admin/users" access="ROLE_ADMIN" />

    <form-login login-page="/admin-login" always-use-default-target="false"/>
    <logout logout-url="/logout" logout-success-url="/home"/>
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="admin" password="password" authorities="ROLE_ADMIN" />
            <user name="member" password="password" authorities="ROLE_MEMBER" />
            <user name="super" password="password" authorities="ROLE_ADMIN,ROLE_MEMBER" />
        </user-service>
    </authentication-provider>
</authentication-manager>