我正在开发一个使用基于表单的登录和一些 OAuth2 集成(GitHub 和 Google 登录)的 Web 应用程序,尽管问题不在于身份验证方法本身,而在于 Spring 中的授权请求
SecurityFilterChain
。
我有以下 Spring Boot 安全配置:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
// Explicitly enable form login and specify the login page to be mapped at "/login"
.formLogin(form -> form.loginPage("/login").permitAll())
.oauth2Login(form -> form.loginPage("/login").permitAll())
.logout((logout) -> logout.logoutUrl("/logout").logoutSuccessUrl("/").permitAll())
// Specify required authentication levels for URL mappings
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/login/**").anonymous()
.requestMatchers("/register/**").anonymous()
.requestMatchers("/events/**").authenticated()
.requestMatchers("/").authenticated()
.anyRequest().permitAll());
return http.build();
}
...我明确允许未经身份验证的用户向我的 Web 应用程序的每个端点发送请求,除了事件页面 (
/events/**
) 和索引页面(可在端点 /
获得)。索引页位于 localhost:8080
。
但是,当我没有登录我的网络应用程序时,我仍然可以访问索引页面,控制器会自动将我重定向到控制器中定义的模板(我觉得不需要在这里包含其他代码,因为这对解决我的问题没有帮助)。
登录页面已正确定义,就好像我想显式拒绝某些其他端点一样,我会正确重定向到
localhost:8080/login
。在这种情况下,第三个定义的请求匹配器(/events/**
)可以正常工作。
使用
/**
作为请求匹配器仍然无法解决问题。
我应该在当前的安全配置中更改什么,以便未经身份验证的用户在导航到索引
/login
端点时重定向到 /
页面?
Maby是因为这条线?
.logout((logout) -> logout.logoutUrl("/logout").logoutSuccessUrl("/").permitAll())
所以根据我的理解(抱歉迟到了)你允许每个人访问“/”