Spring Boot 中的基本身份验证

x33g5p2x  于2022-09-15 转载在 Spring  
字(1.6k)|赞(0)|评价(0)|浏览(488)

让我们通过一个示例了解如何在Spring MVC应用程序中实现基本身份验证。

配置基本身份验证

要设置基本身份验证,您需要提供我们自己的HttpSecurity配置。与提供自定义登录表单类似,此设置还需要自定义WebSecurity配置适配器,如下所示。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .httpBasic();
    }
}
Code language: CSS (css)

这是你唯一需要做的改变。将此配置添加到应用程序后,重新启动并访问http://localhost:8080/hello。这次浏览器将显示用户名和密码对话框。不同浏览器之间的对话框本身可能会有所不同(见下图)。然而,它们都需要用户名和密码。

显示基本身份验证对话框的浏览器

提供用户名和密码后,您将看到一个“***Hello world!***”消息

基本身份验证的浏览器行为

您可能想知道浏览器如何知道何时请求凭据。这种独创性是RFC规范的一部分。当请求到达支持基本身份验证的服务器时,服务器必须使用401 Unauthorized响应代码和WWW Authenticate头进行响应。此标头包含服务器支持的身份验证类型。在这种情况下,它将指定E1D1E。

使用BasicAuth进行会话处理

默认情况下,Spring Security启用会话管理。这意味着JSESSIONID cookie将与浏览器交换以供进一步请求。此时,进一步的请求不需要授权头。但是,浏览器的默认行为是发送授权头。此行为用于客户端和服务器建立无状态通信。我们将在接下来的文章中讨论会话和状态。请记住,会话只是服务器跟踪客户端请求的概念。

我们可以完全利用基本身份验证,只需对spring配置进行一个小小的更改,就可以完全禁用会话管理。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .httpBasic()
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
}
Code language: CSS (css)

通过将会话创建策略设置为无状态,服务器将不再发送JSESSIONID cookie。您可以通过进入应用程序>存储>Cookies在Chrome开发者工具中检查这一点。

当同一应用程序的多个实例在负载平衡器或网关后面运行时,这可能会有所帮助。这样,应用程序不需要像Redis一样共享公共会话存储。

需要注意的点

1.具有基本身份验证的请求中的密码是编码的,而不是加密的。为了安全起见,仅当客户端和服务器之间的通信具有某种形式的加密(如SSL/TLS)时,才使用基本身份验证。

1.当与内存中的UserDetailService用户(如创建的默认用户)一起使用时,基本身份验证可能是最好的。如果要从数据库或第三方获取用户详细信息,性能将变得更差。

1.补充第2点,您可以通过从缓存(如Redis)加载用户详细信息来提高性能。

您可以在我们的GitHub Repository中找到此示例。

相关文章

微信公众号

最新文章

更多