2016-07-14 2 views
2

Я использую Spring security для определения правил доступа на уровне метода и сталкиваясь с проблемой, это аннотации Spring Security не работают на уровне сервиса. Но они работают нормально на уровне контроллера.Весенние аннотации безопасности не работают на уровне обслуживания

Вот моя конфигурация:

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired 
private UserDetailsService userDetailsService; 

@Bean 
public PasswordEncoder passwordEncoder() { 
    return new BCryptPasswordEncoder(); 
} 

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
    auth 
      .userDetailsService(userDetailsService) 
      .passwordEncoder(passwordEncoder()); 

} 

@Override 
public void configure(WebSecurity web) throws Exception { 
    web 
      .ignoring() 
      .antMatchers("/api/register") 
      .antMatchers("/api/activate") 
      .antMatchers("/api/lostpassword") 
      .antMatchers("/api/resetpassword"); 

} 

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

@EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true) 
private static class GlobalSecurityConfiguration extends GlobalMethodSecurityConfiguration { 

    @Autowired 
    private MutableAclService mutableAclService; 

    @Autowired 
    private RoleHierarchy roleHierarchy; 

    public GlobalSecurityConfiguration() { 
     super(); 
    } 

    @Override 
    protected MethodSecurityExpressionHandler createExpressionHandler() { 
     DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); 
     expressionHandler.setPermissionEvaluator(new AclPermissionEvaluator(mutableAclService)); 
     expressionHandler.setRoleHierarchy(roleHierarchy); 
     return expressionHandler; 
    } 

} 

}

служба не работает:

@Override 
@PreAuthorize("hasRole('ROLE_ADMIN')") 
public Iterable<Appliance> getAll() { 
    return applianceRepo.findAll(); 
} 

Контроллер работает хорошо:

@PreAuthorize("hasRole('ROLE_ADMIN')") 
@RequestMapping(method = RequestMethod.GET) 
public ResponseEntity<PagedResources<Appliance>> getPage(@PageableDefault Pageable pageable, PagedResourcesAssembler pagedAssembler) { 
    Page<Appliance> appliancePage = applianceService.getPage(pageable); 
    return ResponseEntity.ok(pagedAssembler.toResource(appliancePage, applianceAssembler)); 
} 
+0

вам нужно будет добавить аннотацию @EnableGlobalMethodSecurity в WebSecurityConfig или где-то еще. – Zemzela

+0

@ Zemzela Я добавил @EnableGlobalMethodSecurity (prePostEnabled = true, jsr250Enabled = true), но это не работает. –

+0

, пожалуйста, прочтите следующее: http://websystique.com/spring-security/spring-security-4-method-security-using-preauthorize-postauthorize-secured-el, это должно быть полезно – Zemzela

ответ

1

я понял, что я неправильно при помещении @PreAuthorize на getAll() метод, но я тестировал по методу getPage(pageable). Весенние конфигурации безопасности работают хорошо. Извините за любые неудобства.

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