Tok*_*kyo 0 spring spring-security basic-authentication spring-boot
专家,,
我有一个 Spring Boot 2.5.5 应用程序(嵌入式 tomcat),我必须在其中配置基本身份验证。
这是我的课程,可以为我完成工作
@Component
@EnableWebSecurity
public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我只需要在浏览器中输入用户/密码一次,它就适用于任何后续请求。此外,在服务器重新启动后我不需要提供新的用户名/密码,这让我抓狂 - 应用程序仍然有效,我可以访问我的 API/页面。
即使我假设浏览器以某种方式保存用户名和密码,一旦服务器因密码更改而重新启动,它就不应该工作 - 不是吗?
更新二:
按照M. Deinum的建议,我将会话设置为无状态,并且成功了。然后,我继续使用 InMemoryUserDetailsManager 实现基本身份验证,并添加以下代码,我们再次回到同一问题。凭据似乎再次存储在会话中,我不需要为后续请求传递它们。
@Autowired
public ApplicationSecurityConfig(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
@Override
@Bean
protected UserDetailsService userDetailsService() {
UserDetails user = User
.builder()
.username("admin")
.password(passwordEncoder.encode("admin"))
.roles("ADMINISTRATOR")
.build();
return new InMemoryUserDetailsManager(user);
}
Run Code Online (Sandbox Code Playgroud)
这就是我希望它能够与您当前的配置配合使用的方式。
使用基本身份验证成功进行身份验证后,浏览器将为所有其他后续请求发送用户名/密码。所以这也是预料之中的。
另一件事是,默认情况下,Spring Security将使用HTTP Session来存储用户信息。每个请求还会发送一个会话 cookie,以便可以为每个请求恢复会话状态。
默认情况下,您的 servlet 容器的会话状态会在您停止服务器时保存到光盘中,当您重新启动并且会话仍然有效(未超时)时,它仍然会进行身份验证。
您可以通过使 Spring Security 不使用会话(将会话模式设置为无状态)来解决此问题。
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
Run Code Online (Sandbox Code Playgroud)
这样做的缺点是,它将重新验证每个请求(这需要一些时间,从而稍微影响您的性能)。但现在重新启动后应该会出现错误,因为您更改了密码。
| 归档时间: |
|
| 查看次数: |
561 次 |
| 最近记录: |