Получить URL-адрес перехвата Spring Security из базы данных или свойств - PullRequest
3 голосов
/ 23 февраля 2010

Надеюсь, это супер просто, существует, и я что-то пропускаю прямо под носом. Я знаю, что могу ограничить доступ с помощью аннотаций:

@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" />

Ответы [ 2 ]

3 голосов
/ 23 февраля 2010

Вы хотите использовать что-то подобное в весеннем XML?

<!-- Settings -->
<b:bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <b:property name="locations">
        <b:value>/WEB-INF/config.properties</b:value>
    </b:property>
</b:bean>

и затем als в вашем Spring XML:

<http entry-point-ref="authenticationProcessingFilterEntryPoint">
        <intercept-url pattern='/custom/**' access="${roles.admin}"/>
</http>
2 голосов
/ 23 февраля 2010

Уже давно, но вы можете создать объект Voter, который поможет решить, разрешить ли доступ к URL. Объект Voter может загружать данные из базы данных или файла или просто случайным образом возвращать Allow, Deny или Abstain.

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