Один из вариантов - написать собственный 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" />