2016-07-14 13 views
2

Ich verwende Spring-Sicherheit, um Zugriffsregeln auf Methodenebene zu definieren, und mit dem Problem konfrontiert ist Spring Sicherheitsanmerkungen funktionieren nicht auf Service-Layer. Aber sie arbeiten normal auf Controller-Ebene.Spring Sicherheitsanmerkungen funktionieren nicht auf Service-Layer

Hier sind meine Konfiguration:

@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; 
    } 

} 

}

Dienst nicht funktioniert:

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

-Controller funktioniert gut:

@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

müssen Sie @EnableGlobalMethodSecurity Annotation in WebSecurityConfig oder woanders hinzufügen. – Zemzela

+0

@Zemzela Ich habe @EnableGlobalMethodSecurity (prePostEnabled = true, jsr250Enabled = true) hinzugefügt, funktioniert aber nicht. –

+0

Bitte lesen Sie dies: http://websystique.com/spring-security/spring-security-4-method-security-using-preauthorize-postauthorize-secured-el sollte es hilfreich sein – Zemzela

Antwort

1

Ich erkannte, dass ich bin falsch beim Putten @PreAuthorize auf getAll() Methode, aber ich habe auf getPage(pageable) Methode getestet. Spring Security-Konfigurationen funktionieren gut. Bitte entschuldigen Sie die Unannehmlichkeiten.

Verwandte Themen