Как использовать DelegatingPasswordEncoder с jdbcAuthentication? [Дубликат]

Я собираюсь предположить, что вы используете проекты веб-сайтов. Они автоматически сканируют свою директорию проектов и бросают все в исходный контроль. Невозможно остановить их.

Однако не отчаивайтесь. Проекты веб-приложений не демонстрируют этого странного и довольно неожиданного поведения (imho: moronic). WAP является дополнением к VS2005 и поставляется с VS2008.

. В качестве альтернативы изменению ваших проектов на WAP вы можете переместить папку «Активы» из «Источника» и в библиотеку документов TFS. Только делайте это, ЕСЛИ сам проект напрямую не использует файлы активов.

3
задан Sergii 9 March 2016 в 15:22
поделиться

1 ответ

Здесь есть 2 gotchas.

Во-первых, при использовании hasRole('ADMIN') сначала выполняется проверка, если он начинается с префикса роли (для которого значением по умолчанию является ROLE_) если не переданная в роли префикс с ним (см. также справочник ). Таким образом, в этом случае проверяется фактический авторитет ROLE_ADMIN, а не ADMIN, как вы ожидаете / предполагаете.

Во-вторых, при использовании опции in memory метод roles делает то же самое, что упоминалось здесь. Он проверяет, начинается ли переданное в ролях префикс роли, а если не добавляет его. Поэтому в вашем примере с памятью вы попадаете в руки ROLE_ADMIN и ROLE_DBA.

Однако в вашей опции JDBC у вас есть полномочия ADMIN и DBA, и поэтому проверка hasRole('ADMIN') не выполняется, потому что ROLE_ADMIN не равно ADMIN.

Чтобы исправить, у вас есть несколько вариантов.

  1. Вместо hasRole используйте hasAuthority, последний не добавляет префикс роли, а для параметра in memory используйте authorities вместо roles.
  2. В параметре JDBC префикс полномочий в базе данных с помощью ROLE_
  3. Установите префикс роли по умолчанию для пустого.

Использование hasAuthority

Сначала измените конфигурацию базы данных в памяти, чтобы использовать authorities вместо roles.

auth.inMemoryAuthentication()
    .withUser("dba").password("root123")
    .authorities("ADMIN","DBA");

также измените ваши выражения

.antMatchers("/db/**").access("hasAuthority('ADMIN') and hasAuthority('DBA')")

Префикс с ROLE_

В скрипте, который вставляет полномочия, префикс полномочий с помощью ROLE_.

Удалить префикс роли по умолчанию

Это немного сложно и подробно описано в [руководстве по миграции].

Нет простой конфигурации и требуется BeanPostProcessor.

public class DefaultRolesPrefixPostProcessor implements BeanPostProcessor, PriorityOrdered {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {

        // remove this if you are not using JSR-250
        if(bean instanceof Jsr250MethodSecurityMetadataSource) {
            ((Jsr250MethodSecurityMetadataSource) bean).setDefaultRolePrefix(null);
        }

        if(bean instanceof DefaultMethodSecurityExpressionHandler) {
            ((DefaultMethodSecurityExpressionHandler) bean).setDefaultRolePrefix(null);
        }
        if(bean instanceof DefaultWebSecurityExpressionHandler) {
            ((DefaultWebSecurityExpressionHandler) bean).setDefaultRolePrefix(null);
        }
        if(bean instanceof SecurityContextHolderAwareRequestFilter) {
            ((SecurityContextHolderAwareRequestFilter)bean).setRolePrefix("");
        }
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        return bean;
    }

    @Override
    public int getOrder() {
        return PriorityOrdered.HIGHEST_PRECEDENCE;
    }
}
4
ответ дан M. Deinum 18 August 2018 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: