2014-10-10 4 views
7

Я пытаюсь добавить возможности ACL на свой сервер. Я настроил весеннюю безопасность с помощью java-файла и хотел бы добавить ACL таким же образом. Как я должен это делать? Все учебники, которые я нашел, использовали XML-файл.Как настроить Spring ACL без XML-файла

SecurityInit:

@Order(1) 
public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer { 
} 

SecurityConfig

@EnableWebMvcSecurity 
@EnableGlobalMethodSecurity(prePostEnabled=true) 
@Component 
@ComponentScan(basePackages = {"test.package"}) 
public class SecurityConfig extends 

WebSecurityConfigurerAdapter { 

... 
    @Autowired 
    protected void registerAuthentication(UserDetailsService userDetailsService, AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userDetailsService); 
    } 

// http://stackoverflow.com/a/21100458/162345 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .csrf().disable() 
       .headers().disable() 
       .addFilterBefore(...) 
       .addFilterBefore(...) 

//    TODO: create a better way to differentiate login to signup 
       .exceptionHandling() 
        .authenticationEntryPoint(noRedirectForAnonymous) 
        .and() 

       .formLogin() 
        .successHandler(restAuthenticationSuccessHandler) 
        .failureHandler(restAuthenticationFailureHandler) 
        .and() 

       .logout() 
        .logoutSuccessHandler(noRedirectLogoutSuccessHandler) 
        .and() 

       .authorizeRequests() 
        .antMatchers("/api/keywords/**").permitAll() 
        .antMatchers("/api/**").authenticated(); 
    } 
} 

ответ

-4

Там нет никакого способа, чтобы настроить пружинный ACL без XML-файла. Это упоминается в весенних документах. Обратитесь к весенней документации.

+4

Этот ответ должен быть обновлен, потому что ответ от @Fiore доказывает, что это не так. Его код также подтверждает это. – le0diaz

12

Вы можете настроить пружинный ACL с классом конфигурации Java, как следовать

@Configuration 
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) 
public class ACLConfig extends GlobalMethodSecurityConfiguration { 

@Autowired 
DataSource dataSource; 

EhCacheBasedAclCache aclCache() { 
    EhCacheFactoryBean factoryBean = new EhCacheFactoryBean(); 
    EhCacheManagerFactoryBean cacheManager = new EhCacheManagerFactoryBean(); 

    factoryBean.setName("aclCache"); 
    factoryBean.setCacheManager(cacheManager.getObject()); 
    return new EhCacheBasedAclCache(factoryBean.getObject()); 
} 


LookupStrategy lookupStrategy() { 
    return new BasicLookupStrategy(dataSource, aclCache(), aclAuthorizationStrategy(), new ConsoleAuditLogger()); 
} 


AclAuthorizationStrategy aclAuthorizationStrategy() { 
    return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ACL_ADMIN"), 
     new SimpleGrantedAuthority("ROLE_ACL_ADMIN"), 
     new SimpleGrantedAuthority("ROLE_ACL_ADMIN")); 
} 

@Bean 
JdbcMutableAclService aclService() { 
    JdbcMutableAclService service = new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache()); 
    service.setClassIdentityQuery("select currval(pg_get_serial_sequence('acl_class', 'id'))"); 
    service.setSidIdentityQuery("select currval(pg_get_serial_sequence('acl_sid', 'id'))"); 
    return service; 
} 

@Bean 
AclMasterService masterService() { 
    return new AclMasterService(); 
} 

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

Важный аспект конфигурации простираются от

GlobalMethodSecurityConfiguration

переопределить метод

createExpressionHandler

и включить до и после разъяснения с последующей на эту заметку начале класса

@EnableGlobalMethodSecurity (prePostEnabled = верно, securedEnabled = верно)

Теперь вы можете использовать такие анотации, как

@PreAuthorize ('hasPermission (# объект, чтение)')

см Контактного образец Spring Security или spring security reference guide для большего использования @Pre и @post разъяснения. Этот класс конфигурации был протестирован в Spring 4, Spring Security 4.0.1 и Spring Security ACL 3.1.2. Если вы хотите настроить аутентификацию, вы можете использовать другой класс Java или переопределить метод configure из этого. Если у вас уже есть настроенный ehcache, эта конфигурация не сможет работать должным образом из-за того, что ehcache является одноэлементным классом, и эта конфигурация пытается создать новую.

+1

Вам не нужно расширять конфигурацию «GlobalMethodSecurityConfiguration». Вам просто нужно выставить '@ Bean' типа' DefaultMethodSecurityExpressionHandler' и '@EnableGlobalMethodSecurity (protectedEnabled = true, prePostEnabled = true)' – nucatus

+0

Какую версию EHCache вы используете? Этот пример не компилируется для 2.10.4, 2.10.3, 2.10.2, не проверял других. – user3791111

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