所以我有一个使用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);
}
}
答案 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建议的路径。