2015-03-26 3 views
0

Я бы хотел добавить (временную для демонстрации) базовую аутентификацию перед показом веб-сайта. Таким образом, пользователь может ввести некоторые учетные данные, такие как demo/demo, чтобы открыть веб-сайт, и после этого использовать обычную проверку подлинности form-login. Я стараюсь добавить это http перед обычной регистрацией формы.Весенняя безопасность: базовая аутентификация перед регистрацией формы

<http pattern="/**" use-expressions="true" authentication-manager-ref="basicAuthManager"> 
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 
    <http-basic /> 
</http> 

<http auto-config="true" use-expressions="true"> 
... 
<form-login .../> 
</http> 

Но у меня есть исключение:

A universal match pattern ('/**') is defined before other patterns in the filter chain, 
causing them to be ignored. Please check the ordering in your <security:http> 
namespace or FilterChainProxy bean configuration 

Кажется, я не могу использовать pattern="/**" дважды?
Можно ли делать то, что я хочу?
Кроме того, после успешной базовой проверки подлинности мне не нужно устанавливать принципал в контексте безопасности.

ответ

0

Весна может принимать несколько схем аутентификации. Однако, насколько я знаю, невозможно выполнить двойную проверку подлинности (например, логин с BASIC и FORM в одно и то же время). Таким образом, вы не можете делать то, что хотите.

Простейшим решением для вас было бы определить аутентификацию BASIC в вашем контейнере сервлетов (например, Tomcat) или перед контейнером сервлета в прокси-HTTP-сервере (например, Apache или Nginx).

Практически достаточно иметь HTTP-сервер перед контейнером сервлетов, поэтому я бы выбрал второй вариант.


Если вы все еще чувствуете, как взлом базовой аутентификации внутри вашего applicaiton, вы можете легко написать свой собственный сервлет фильтр аутентификации. Это должно быть довольно просто.

+0

Это, как я начал с, но у меня был точно такой же проблемы, как здесь: http://stackoverflow.com/questions/22198729/tomcat-authentication-and-spring-security – Alex

+0

Проблема с этим вопросом заключается в том, что используется 'auto-config'. Это автоматически регистрирует компоненты обработки «http-basic». Таким образом, Tomcat и Spring Security пытались интерпретировать заголовок «Авторизация». Пожалуйста, обратитесь к [официальной документации по этой функции] (http://docs.spring.io/spring-security/site/docs/3.1.x/reference/ns-config.html#ns-auto-config). –

0

Я думаю, что у вас есть две проблемы здесь:

  1. У вас есть две http метки. Я не уверен на 100%, но у меня есть сильное подозрение, это не так.
  2. Вам не нужен шаблон в теге http. Попробуйте удалить его и оставить только свойство pattern на уровне intercept-url. Кроме того, поскольку вы не будете манипулировать Principal, вам нужно будет использовать isAuthenticated(), а не hasRole(...). Как это:

    <http auto-config="true" use-expressions="true" authentication-manager-ref="basicAuthManager"> 
        <intercept-url pattern="/**" access="isAuthenticated()" /> 
        <http-basic /> 
    </http> 
    
Смежные вопросы