2015-11-04 1 views
2

Вот мой код:весна не @PreAuthorize работы с @EnableGlobalMethodSecurity (prePostEnabled = истина)

@Configuration 
@ComponentScan(basePackages = "com.webapp") 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Bean 
    @Override 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http. 
     authorizeRequests().antMatchers("/resources/**").permitAll(). 
     antMatchers("/admin/**").hasRole("ADMIN"). 
     anyRequest().authenticated(). 
     and(). 
     formLogin().loginPage("/login").permitAll(). 
     and(). 
     logout().permitAll(); 
} 

@Autowired 
public void configureGlobal(UserDetailsService userDetailsService, AuthenticationManagerBuilder auth) 
     throws Exception { 

    auth.userDetailsService(userDetailsService); 

} 
} 

когда запрос/администратор/* приходит, он будет проверять, имеет ли пользователь роли администратора по телефону " antMatchers ("/ администратор/**"). hasRole ("ADMIN") «. , но в моем контроллере он не проверяет, имеет ли пользователь другие разрешения с @PreAuthorize.

+0

Есть ли особая причина, почему ваш контроллер как @PreAuthorize («denyall»)? Если preauth терпит неудачу в классе, он даже не ударит по методу, чтобы попытаться использовать preauth. –

+0

@JeffWang я удалил denyall, но как только пользователь с административной ролью регистрируется без разрешения «view_user», все равно может получить доступ к URL-адресу. я уверен, что предварительная авторизация не работает. есть ли у вас какие-либо предложения, спасибо –

+0

Из того, что я понимаю, сначала фильтруется цепочка фильтров, поэтому первое оцениваемое правило имеет роль администратора. Второй - это уровень preauth класса, который отрицает все. Третий, если он проходит через оба, является уровнем метода preauth, который имеет роль user_view. Тот факт, что denyall работает, означает, что preauth работает. вы можете захотеть проверить, какие роли имеет пользователь, зарегистрированный в списке, в методе listUsers. (SecurityContextHolder.getContext(). GetAuthentication(). GetAuthorities()) –

ответ

3

Как правило, Spring Spring становится доступным в контексте корневого приложения, а компоненты Spring MVC инициализируются в дочернем контексте. Следовательно, org.springframework.security.config.annotation.configuration.AutowireBeanFactoryObjectPostProcessor не может обнаружить ваши контроллеры, потому что они живут в контексте, который неизвестен корневому контексту.

@EnableGlobalMethodSecurity или <global-method-security> должен быть размещен внутри одного класса конфигурации или файл XML, где ваш Spring MVC configration живет для того, чтобы дать возможность @PreAuthorize и @PostAuthorize.

Смежные вопросы