使用Spring Security从静态文件夹服务Angular 2项目

时间:2017-02-20 18:25:09

标签: spring spring-mvc angular spring-security

所以我有一个使用Angular2的工作前端和一个使用Java的工作后端,我所做的是从静态文件夹中提供我的index.html,该文件夹还包含我的所有前端资源。问题是,当我尝试将Spring Security添加到后端时,由于@EnableWebSecurity注释,资源不再可访问。当我导航到我的localhost http://localhost:8080/时,不会提供index.html。但是如果我访问它或手动编写路径的任何其他资源,它会加载。 我不想以不同的方式为我的前端服务,有没有办法从静态做到这一点?我尝试了以下方法:

这是我的安全配置:

@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 个答案:

答案 0 :(得分:4)

在扩展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,则ant匹配器/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之类的安全端点或类似的东西上,并将静态内容放在忽略的路径上。

答案 1 :(得分:-1)

问题可能是angular-cli将所有资源放在应用程序的根目录下。 (虽然我不确定你是否使用angular-cli)

但是让我们接受这个想法。

angular-cli输出类似

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

这使您很难应用spring security antMatcher。

angular-cli有一个名为--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>

然后你应该可以忽略Tom建议的路径。