Я собираюсь предположить, что вы используете проекты веб-сайтов. Они автоматически сканируют свою директорию проектов и бросают все в исходный контроль. Невозможно остановить их.
Однако не отчаивайтесь. Проекты веб-приложений не демонстрируют этого странного и довольно неожиданного поведения (imho: moronic). WAP является дополнением к VS2005 и поставляется с VS2008.
. В качестве альтернативы изменению ваших проектов на WAP вы можете переместить папку «Активы» из «Источника» и в библиотеку документов TFS. Только делайте это, ЕСЛИ сам проект напрямую не использует файлы активов.
Здесь есть 2 gotchas.
Во-первых, при использовании hasRole('ADMIN')
сначала выполняется проверка, если он начинается с префикса роли (для которого значением по умолчанию является ROLE_
) если не переданная в роли префикс с ним (см. также справочник ). Таким образом, в этом случае проверяется фактический авторитет ROLE_ADMIN
, а не ADMIN
, как вы ожидаете / предполагаете.
Во-вторых, при использовании опции in memory метод roles
делает то же самое, что упоминалось здесь. Он проверяет, начинается ли переданное в ролях префикс роли, а если не добавляет его. Поэтому в вашем примере с памятью вы попадаете в руки ROLE_ADMIN
и ROLE_DBA
.
Однако в вашей опции JDBC у вас есть полномочия ADMIN
и DBA
, и поэтому проверка hasRole('ADMIN')
не выполняется, потому что ROLE_ADMIN
не равно ADMIN
.
Чтобы исправить, у вас есть несколько вариантов.
hasRole
используйте hasAuthority
, последний не добавляет префикс роли, а для параметра in memory используйте authorities
вместо roles
. ROLE_
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;
}
}