2017-02-20 5 views
1

Итак, у меня есть рабочий интерфейс с Angular2 и работающий бэкэнд с Java, и я должен служить моему index.html из статической папки, которая также содержит все мои внешние ресурсы. Проблема в том, что когда я попытался добавить Spring Security на бэкэнд, ресурсы больше не доступны из-за аннотации @EnableWebSecurity. Когда я перехожу к моему localhost http://localhost:8080/, index.html не обслуживается. Но если я получаю доступ к нему или любому другому ресурсу, пишущему путь вручную, он загружается. Я не хотел бы обслуживать свой интерфейс по-разному, есть ли способ сделать это со статики? Я попытался следующие:Serve Angular 2 project from static folder with Spring Security

Вот моя конфигурация безопасности:

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

private static final Logger logger = LoggerFactory.getLogger(SecurityConfig.class); 

public static final String REMEMBER_ME_KEY = "rememberme_key"; 

public SecurityConfig() { 
    super(); 
    logger.info("loading SecurityConfig ................................................ "); 
} 

@Autowired 
private UserDetailsService userDetailsService; 

@Autowired 
private RestUnauthorizedEntryPoint restAuthenticationEntryPoint; 


@Autowired 
private AuthenticationSuccessHandler restAuthenticationSuccessHandler; 

@Autowired 
private AuthenticationFailureHandler restAuthenticationFailureHandler; 

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


@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().antMatchers("/front/**","/index.html"); 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .headers().disable() 
     .csrf().disable() 
     .authorizeRequests() 
      .antMatchers("/failure").permitAll() 
      .anyRequest().authenticated() 
      .and() 
     .exceptionHandling() 
      .authenticationEntryPoint(restAuthenticationEntryPoint) 
      .and() 
     .formLogin() 
      .loginPage("/login") 
      .loginProcessingUrl("/authenticate") 
      .successHandler(restAuthenticationSuccessHandler) 
      .failureHandler(restAuthenticationFailureHandler) 
      .usernameParameter("username") 
      .passwordParameter("password") 
      .permitAll() 
      .and() 
     .logout() 
      .logoutUrl("/logout") 
      .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler()) 
      .deleteCookies("JSESSIONID") 
      .permitAll() 
      .and(); 

} 
} 

WebMvcConfiguration:

@Configuration 
public class WebMvcConfiguration extends WebMvcConfigurerAdapter { 

@Override 
public void addViewControllers(ViewControllerRegistry registry) { 
//registry.addViewController("/").setViewName("front/index.html"); 
//registry.addViewController("/").setViewName("forward:/index.html"); 
    registry.addViewController("/").setViewName("redirect:/index.html"); 

registry.setOrder(Ordered.HIGHEST_PRECEDENCE); 
} 

} 

Application.java:

@SpringBootApplication 
public class Application { 

public static void main(String[] args) { 
    SpringApplication.run(Application.class, args); 
} 
} 

ответ

2

В классе, который расширяет WebSecurityConfigurerAdapter вы можете добавить следующие:

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().antMatchers("/front/**"); 
} 

Любой муравейник, который вы положили в web.ignoring(), должен быть проигнорирован методом весны.

По умолчанию статический контент должен быть размещен в одном из следующих каталогов под src/main/resources (от spring boot - static content):

/META-INF/resources/ 
/resources/ 
/static/ 
/public/ 

Тогда любой муравей согласовани проверяется перед подпапок.

Например, если ваш статический контент находится в src/main/resources/static/front, то муравейник /front/** должен игнорировать все ресурсы в этой подпапке.

Кроме того, для того, чтобы разоблачить index.html вы должны поместить его в src/main/resources/static и добавить что-то вроде следующего класса для того, чтобы выставить его в качестве основного ресурса, когда доступ к сайту:

@Configuration 
public class WebMvcConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
     registry.addViewController("/").setViewName("index.html"); 
     registry.setOrder(Ordered.HIGHEST_PRECEDENCE); 
    } 

} 

и, конечно, добавить в качестве муравьиного брата: web.ignoring().antMatchers("/*", "/front/**", "index.html");

/* не разрешает всех, /** делает это. убедитесь, что вы размещаете API на защищенной конечной точке, например /api, или что-то в этом роде, и статическое содержимое на игнорируемом пути.

+0

прямо в статике или в папке спереди, src/main/resources/static/front? – Tom

+0

Я попробовал оба, прямо сейчас у меня есть это в src/main/resources/static/front – Battalgazi

+0

Можете ли вы попытаться получить доступ к определенному ресурсу, чтобы узнать, есть ли проблема с муравьем-совместителем или выставляете свой index.html? Если у вас возникли проблемы с экспонированием вашего index.html (если он находится в передней папке), я могу добавить соответствующий код, чтобы разоблачить его в моем ответе. – Tom

-1

Проблема может заключаться в том, что angular-cli помещает все ресурсы в корень вашего приложения. (Хотя я не уверен, что вы используете angular-cli)

Но давайте рассмотрим это понятие.

угловой кли выводит что-то вроде

/inline.8faab088ca0e1cca9031.bundle.js 
/main.c7b67df9d7c42383815c.bundle.js 
/polyfills.c234d2c8820869e3c698.bundle.js 
/styles.d41d8cd98f00b204e980.bundle.css 
/vendor.f0f36dacdf3fba21c295.bundle.js 

Это делает его очень трудно для вас, чтобы применить antMatcher пружины безопасности.

угловой кли имеет конфигурацию, называемую --deploy-url=/ui/, который будет означать, что все файлы сценариев указывать на каталог с именем /ui/

<script type="text/javascript" src="/ui/inline.4c30f42211c1d30d3dd3.bundle.js"></script> 
<script type="text/javascript" src="/ui/polyfills.c234d2c8820869e3c698.bundle.js"></script> 
<script type="text/javascript" src="/ui/vendor.f0f36dacdf3fba21c295.bundle.js"></script> 
<script type="text/javascript" src="/ui/main.c7b67df9d7c42383815c.bundle.js"></script> 

Тогда вы должны быть в состоянии игнорировать путь, говорит Том.

+0

Im не использует угловые cli – Battalgazi