2009-07-01 4 views
9

У меня есть одно определение контекста безопасности, использующее PreAuthenticatedProcessingFilterEntryPoint для гибкой части моего приложения. Как я могу получить другое определение, которое будет использовать вход в стандартную форму с html-формами для другой части моего приложения? Вот что я в настоящее время:Могу ли я иметь несколько контекстов безопасности с весной?

<?xml version="1.0" encoding="UTF-8"?> 
<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-2.0.xsd 
         http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd"> 


    <http auto-config="true" access-denied-page="/admin/access-denied"> 
     <intercept-url pattern="/admin/login*" filters="none"/> 
      <intercept-url pattern="/admin/access-denied" filters="none"/> 
     <intercept-url pattern="/admin/**/*" access="ROLE_ADMIN" /> 
     <form-login login-page="/admin/login" authentication-failure-url="/admin/login?login_error=1" 
      default-target-url="/admin/index" login-processing-url="/admin/login-process"/> 
     <logout logout-success-url="/admin/login"/> 

    </http> 

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

    <beans:bean id="preAuthenticatedEntryPoint" class="org.springframework.security.ui.preauth.PreAuthenticatedProcessingFilterEntryPoint" > 
    </beans:bean> 


    <beans:bean id="userAccountManager" class="com.mycomp.service.managers.jpa.UserAccountJpaManager" /> 
    <beans:bean id="userService" class="com.mycomp.auth.DefaultUserDetailsService" /> 
    <beans:bean id="defaultPasswordEncoder" class="com.mycomp.auth.DefaultPasswordEncoder" /> 

    <authentication-provider user-service-ref="userService"> 
     <password-encoder ref="defaultPasswordEncoder"/> 
    </authentication-provider> 


</beans:beans> 

То, что я хотел бы сделать, это использовать другой поставщик проверки подлинности для URL-адресов, которые находятся на сайте администратора, то один я в настоящее время для гибкого применения. Поэтому я хочу, чтобы в качестве защиты для URL-адресов администратора использовался другой компонент userDetailsService.

+0

У меня такая же проблема ... как это закончилось? – HDave

+0

@HDave Я не уверен, как проблема с весной, связанная с безопасностью, оказалась (хотя, я думаю, я решил ее как-то увидеть ответы ниже), но в конце концов я бросил идею интерфейса администратора java и полностью переписал его в Jython в конец большинства бэкэндов приложения для проекта пошел именно так. – Vasil

ответ

0

Все дело в том, какие части вашего приложения перехватываются цепочкой фильтров Spring Security. Где-то в конфигурации XML (в зависимости от того, если вы сделали простой тег конфигурации или нет) есть перехватывать регулярное выражение так:

<intercept-url pattern="/**" ...> 

Вы можете иметь различные шаблоны перехвата, которые используют различные конфигурации (ака различных частей цепь фильтра безопасности). Я мог бы дать вам более конкретный ответ, если вы разместите текущую конфигурацию xml.

EDIT: В настоящее время вы используете тег http, чтобы определить конфигурацию Spring Security. Этот тег используется как ярлык/помощник, и он автоматически определяет множество фрагментов цепочки фильтров безопасности, которые также можно настроить вручную. Я думаю, что ваш прецедент не подходит для парадигмы автоматической настройки, поэтому вам нужно вручную настроить цепочку фильтров для разных шаблонов URL (как видно из сообщения ниже моего). Вы можете создать свой собственный PreAuthenticationFilter (который возьмет пользовательский UserDetailsService) и добавит, что, в случае необходимости, к отображению перехвата цепочки фильтров.

+0

Я опубликовал конфигурацию контекста безопасности. Буду признателен, если вы сможете мне помочь. – Vasil

2

Карта каждый фильтр цепи шаблону Diferent URL:

<bean id="myfilterChainProxy" 
    class="org.springframework.security.util.FilterChainProxy"> 
    <security:filter-chain-map pathType="ant"> 
    <security:filter-chain pattern="/flex" filters="filterF"/> 
    <security:filter-chain pattern="/**" filters="filter1,filter2,filter3"/> 
    </security:filter-chain-map> 
</bean> 
+0

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

12

Это не было сложно сделать до недавнего времени, но теперь это легко!

Spring Security добавила поддержку сценария в версии 3.1. В настоящее время он доступен как кандидат на выпуск, реализованный в SEC-1171. Подробности синтаксиса приведены в руководстве, включенном в 3.1.

Это довольно прост в использовании. В основном вы просто определяете несколько элементов http в своей конфигурации Spring Security, по одному для каждого контекста. Мы используем это следующим образом:

<!-- Configure realm for system administration users --> 
<security:http pattern="/admin/**" create-session="stateless"> 
    <security:intercept-url pattern='/**' access='ROLE_ADMIN' requires-channel="https" /> 
    <security:custom-filter position="PRE_AUTH_FILTER" ref="preAuthFilter" /> 
</security:http> 


<!-- Configure realm for standard users --> 
<security:http auto-config="true" access-denied-page="/error/noaccess" use-expressions="true" create-session="ifRequired"> 
    <security:form-login 
      ... 
      ... 
</security:http> 

Главное, чтобы отметить это pattern="/admin/**" на первом http элемента. Это говорит Spring, что все URL-адреса под /admin подчиняются этому контексту, а не контексту по умолчанию, и поэтому URL-адреса ниже /admin используют фильтр предварительной авторизации.

+0

Привет, У меня такая же проблема при использовании нескольких элементов 'http'.Я сопоставил его с разными шаблонами и по-прежнему разделял «SecurityContext» между областями безопасности (элементы 'http'). –

Смежные вопросы