Java Spring Security - перехватить поддомен URL для другого входа в систему? - PullRequest
7 голосов
/ 28 марта 2012

У меня есть приложение с установленной Spring Security, которое работает нормально - в настоящее время у него заканчивается www.exampledomain.com.

Теперь я хочу расширить приложение, работающее вне поддоменов.Например, newapp.exampledomain.com.

Единственная проблема состоит в том, что для этого нового приложения пользователь должен войти в систему. Весной очень легко перехватить URL через <intercept-url pattern="/Admin/*" access="ROLE_GENERAL"/>

, но что делатьвы делаете, когда хотите перехватить поддомен для входа в систему?Например, следующее не работает для меня:

<intercept-url pattern="http://newapp.exampledomain.com/*" access="ROLE_GENERAL"/>

Есть мысли о том, как обойти это?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2012

Один из вариантов - написать собственный AccessDecisionVoter, который расширяет RoleVoter и добавляет дополнительную проверку на основе имени хоста. Примерно так:

public class MyVoter extends RoleVoter {
  public int vote(Authentication authentication,
                java.lang.Object object,
                java.util.Collection<ConfigAttribute> attributes) {
    FilterInvocation filterInvocation = (FilterInvocation) object;
    HttpRequest request = filterInvocation.getHttpRequest();
    // get subdomain from request
    String subdomain = getSubdomain(request);
    if ("free".equals(subdomain)) {
      return ACCESS_GRANTED;
    }
    else {
      super.vote(authentication, object, attributes);
    }
  }
}

Затем подключите своего избирателя:

<security:http auto-config="true" 
               use-expressions="true" 
               access-decision-manager-ref="accessDecisionManager">
...
</security:http>

<bean id="accessDecisionManager"
      class="org.springframework.security.access.vote.UnanimousBased">
    <property name="decisionVoters">
        <list>
            <bean class="com.acme.MyVoter" />
        </list>
    </property>
</bean>

Если вы хотите сделать еще один шаг вперед, вы также можете написать свои атрибуты конфигурации , которые позволят вам удалить жестко заданные проверки имени хоста у избирателя и сделать что-то вроде:

<intercept-url pattern="/Admin/*" access="ROLE_GENERAL" domain="free.acme.com" />
1 голос
/ 06 июня 2014

В вашем файле cookie сеанса домен должен быть явно установлен на exampledomain.com.

Сервер приложений отвечает за создание файла cookie сеанса (JSESSIONID), но не Spring Security.

Все, что вам нужносделать это, чтобы сообщить серверу приложений, что вы хотите, чтобы в cookie всегда был один и тот же домен.

Добавить в ваш web.xml:

   <session-config>
        <cookie-config>
            <domain>exampledomain.com</domain>
        </cookie-config>
    </session-config>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...