Надеюсь, это супер просто, существует, и я что-то пропускаю прямо под носом. Я знаю, что могу ограничить доступ с помощью аннотаций:
@Secured({"ROLE_ADMIN"})
или через конфигурацию:
<security:intercept-url pattern="/**" access="ROLE_USER, ROLE_ADMIN, ROLE_SUPER_USER" />
Я бы предпочел получить правила аутентификации из базы данных, например:
<security:intercept-url provider="authProvider"/>
<bean id="authProvider" class="AuthProviderImpl">
<property name="userDetailsService" ref="userDetailsService"/>
</bean>
В худшем случае должен быть способ заполнить файл свойств, верно? ...
/admin/**=ROLE_ADMIN
/**=ROLE_USER
<security:intercept-url props="classpath:urls.properties"/>
и т.д.
Пожалуйста, скажите мне, что это существует, или мой мозг взорвется !!! Плагин Grails для защиты от пружин поставляется с этим из коробки, поэтому я знаю, что он должен существовать. Пожалуйста, не дай моему мозгу взорваться !!!
EDIT:
Разобрался ...
Вы должны предоставить пользовательский org.springframework.security.intercept.web.FilterSecurityInterceptor
и предоставить objectDefinitionSource
:
<bean id="filterSecurityInterceptor" class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
<security:custom-filter before="FILTER_SECURITY_INTERCEPTOR" />
<property name="authenticationManager" ref="authenticationManager" />
<property name="accessDecisionManager" ref="accessDecisionManager" />
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**login.html=IS_AUTHENTICATED_ANONYMOUSLY
/user/**=ROLE_ADMIN
</value>
</property>
</bean>
И я думаю, что собираюсь использовать FactoryBean:
public class RequestMappingFactoryBean implements FactoryBean {
private final static String EOL = System.getProperty("line.separator");
public Object getObject() throws Exception {
StringBuffer sb = new StringBuffer();
sb.append("CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON");
sb.append(EOL);
sb.append("PATTERN_TYPE_APACHE_ANT");
sb.append(EOL);
sb.append("/**login.html=IS_AUTHENTICATED_ANONYMOUSLY");
sb.append(EOL);
sb.append("/user/**=ROLE_ADMIN");
return sb.toString();
}
@SuppressWarnings("unchecked")
public Class getObjectType() {
return String.class;
}
public boolean isSingleton() {
return true;
}
}
Передайте DAO и т. Д.
<bean id="filterSecurityInterceptor" class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
<security:custom-filter before="FILTER_SECURITY_INTERCEPTOR" />
<property name="authenticationManager" ref="authenticationManager" />
<property name="accessDecisionManager" ref="accessDecisionManager" />
<property name="objectDefinitionSource" ref="requestMappings" />
</bean>
<bean id="requestMappings" class="RequestMappingFactoryBean" />