首页 文章

Spring Security表单登录

提问于
浏览
0

我有Spring引导应用程序和src / main / webapp / my-login.html下的自定义登录页面 . 我将Spring Security配置如下:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated().and()
                .formLogin().loginPage("/my-login").permitAll().and()
                .csrf().disable();
    }
}

如何让HTTP GET到/ my-login返回我的HTML页面?我知道它被命名为“my-login.html”,而不仅仅是“my-login”,但删除.html扩展名会让Chrome变得疯狂(它试图下载文件......) . 我尝试将HTML文件(带或不带扩展名)放在src / main / webapp或src / main / resources / static下 .

另请注意我没有使用Thymeleaf,目标前端框架将是AngularJS . 我也对优雅的解决方案感兴趣(我认为我想要实现的是非常简单的目标) - 我认为我使用了loginPage(“/ my-login.html”),但REST endpoints 似乎不对 .

3 回答

  • 1

    您可以设置视图控制器以将请求转发到my-login.html ...

    @Configuration
    public class MvcConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/my-login").setViewName("forward:/my-login.html");
            registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        }
    
    }
    
  • 3

    如果要将AngularJS用于前端应用程序,则创建API身份验证 endpoints 可能是最佳解决方案 . 您可以使用任何您想要的身份验证机制,但是简单的基本身份验证(可选地带有一些持久性令牌)可以用于启动 . 所以,你会有一个特殊的终点,例如:

    受基本身份验证保护的 /token POST 会在成功时返回一个令牌对象,该对象稍后可用于所有请求(例如在请求头中) .

    您的AngularJS将是一个完全独立的应用程序,它只使用您的API endpoints . 此应用程序可以选择将身份验证令牌保留在客户端会话中,因此用户无需在每次打开应用程序时输入凭据 . 此外,这是一个非常干净的解决方案,可以单独测试 . 此外,这种方式的前端应用程序可以由其他团队开发,而不需要任何有关Spring技术细节的知识 .

  • 2

    我使用formLogin属性玩了一点,并得到了这个解决方案:

    formLogin().loginPage("/my-login.html").loginProcessingUrl("/my-login").defaultSuccessUrl("/my-home.html", true).permitAll()
    

    这样我就可以将HTML文件作为登录页面返回,并使用干净的POST endpoints 来传递登录数据 .

相关问题