Spring boot 如何让 Thymeleaf 网页和 REST API 具有不同的身份验证方案

Posted

技术标签:

【中文标题】Spring boot 如何让 Thymeleaf 网页和 REST API 具有不同的身份验证方案【英文标题】:Spring boot how to have Thymeleaf web page and REST API with different authentications Schemes 【发布时间】:2020-09-08 04:32:03 【问题描述】:

就像问题说的那样,我们如何配置 Spring Security 以对项目的 Thymeleaf 网页部分进行表单身份验证,并为项目的 REST API 部分进行 JWT 身份验证?,因为我们希望这两个项目都在相同的容器,而不必为外部 Tomcat 应用程序服务器提供资源以具有相同的安全配置(SSL、密码、证书等)。

到目前为止,我们还没有找到方法,但是如果您可以在同一个项目上拥有 Thymeleaf 和 REST API,我认为可以将 Spring Security 配置为必须对项目进行身份验证。

【问题讨论】:

【参考方案1】:

您可以通过添加两个WebSecurityConfigurerAdapter bean 来实现此行为,如下所示:

@Order(1) - /api/** 受基本身份验证保护,在您的情况下为 JWT 身份验证。

@Order(2) - /website/** 受表单登录保护,在您的情况下 Thymeleaf 登录。

查看Spring Boot 的文档和示例代码here。

@EnableWebSecurity
public class SecurityConfig 

    @Configuration
    @Order(1)
    public class ApiSecurityConfig extends WebSecurityConfigurerAdapter 

        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http
                .antMatcher("/api/**")
                .authorizeRequests()
                    .anyRequest().hasRole("API_USER")
                .and()
                .httpBasic();
        
    

    @Configuration
    @Order(2)
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter 
        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/website/**").hasRole("ADMIN")
                .and()
                .formLogin()
                .and()
                .logout().permitAll()
            ;
        
    


【讨论】:

感谢您的帮助

以上是关于Spring boot 如何让 Thymeleaf 网页和 REST API 具有不同的身份验证方案的主要内容,如果未能解决你的问题,请参考以下文章

spring boot:thymeleaf使用详解

Spring Boot + Thymeleaf Security 无法识别

在 Spring Boot 应用程序中使用 JSP 和 Thymeleaf 视图

Thymeleaf + Spring (not Boot) - 如何显示来自 messageSource 的消息

Spring Boot + Spring Security + Thymeleaf 中的静态 Web 资源

Spring Boot + Thymeleaf 找不到消息属性