gpt4 book ai didi

spring - 使用 Spring Security 从静态文件夹提供 Angular 2 项目

转载 作者:行者123 更新时间:2023-12-04 00:06:18 24 4
gpt4 key购买 nike

所以我有一个使用 Angular2 的工作前端和一个使用 Java 的工作后端,我所做的是从包含我所有前端资源的静态文件夹中提供我的 index.html。问题是,当我尝试将 Spring Security 添加到后端时,由于 @EnableWebSecurity 注释,资源不再可访问。当我导航到我的本地主机时 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();

}
}

WebMvc配置:
@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);
}

}

应用程序.java:
@SpringBootApplication
public class Application {

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

最佳答案

在扩展 WebSecurityConfigurerAdapter 的类中您可以添加以下内容:

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

您放入的任何 Ant 匹配器 web.ignoring() spring 安全性应该忽略方法。

默认情况下,静态内容应放置在 src/main/resources 下的以下目录之一中(来自 spring boot - static content):
/META-INF/resources/
/resources/
/static/
/public/

然后在子文件夹前面检查任何 Ant 匹配器。

例如,如果您的静态内容位于 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);
}

}

当然,将它添加为 Ant 匹配器: web.ignoring().antMatchers("/*", "/front/**", "index.html"); /*不允许所有, /**这样做。确保将 API 放在安全端点上,例如 /api或类似的东西以及被忽略路径上的静态内容。

关于spring - 使用 Spring Security 从静态文件夹提供 Angular 2 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42351784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com