我正在學習spring security,我已經在另一個專案中遇到過這個問題,我復制了這個簡單的rest api只是為了看看它是否會再次發生。當我到達受保護的端點時,它會檢查請求的有效性,但只檢查一次。事實上,我可以停止應用程式,關閉瀏覽器,然后重新打開任何東西,但仍然登錄并且不再詢問密碼。我也試過郵遞員看看它是否是瀏覽器問題,(用chrome和firefox檢查),但它仍然是一樣的,第一次問我密碼,然后一旦登錄,在郵遞員中使用基本身份驗證,我甚至可以只使用用戶名登錄而無需輸入任何密碼。
控制器:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping
public String home() {
return "Hello, World!";
}
@GetMapping("/user")
public String user() {
return "Hello, User!";
}
@GetMapping("/admin")
public String admin() {
return "Hello, Admin!";
}
}
安全配置:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import
org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration
@EnableWebSecurity
公共類 SecurityConfig {
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("password")
.roles("ADMIN", "USER")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
@Bean
public SecurityFilterChain configure(HttpSecurity http) throws Exception {
return http
.csrf(csrf -> csrf.disable())
.authorizeRequests(auth -> {
auth.antMatchers("/").permitAll();
auth.antMatchers("/user").hasRole("USER");
auth.antMatchers("/admin").hasRole("ADMIN");
})
.httpBasic(withDefaults())
.build();
}
}
uj5u.com熱心網友回復:
Spring Boot 默認使用嵌入式 tomcat 運行您的應用程式
如果您已經構建了 jar 并且您只是正常關閉了應用程式并再次重新啟動它,那么您仍然看到存在身份驗證是正常的。
來自 tomcat檔案
每當 Apache Tomcat 正常關閉并重新啟動時,或者當觸發應用程式重新加載時,標準管理器實作將嘗試將所有當前活動的會話序列化到通過路徑名屬性定位的磁盤檔案。當應用程式重新加載完成時,所有這些保存的會話將被反序列化并激活(假設它們同時沒有過期)。
上面的意思是,記憶體中的 HttpSession 中存在的安全認證將在關機期間傳輸到硬碟,如果尚未過期,則在重啟期間重新加載到 ram 記憶體中。
以上將回答為什么即使在您重新啟動后應用程式也會記住您。
至于您關閉瀏覽器,我認為您正在關閉瀏覽器的選項卡,因此當您重新打開新選項卡并向重新啟動的應用程式發送請求時,httpBasic 標頭仍然存在。
為了避免這種情況,tomcat 存盤會話并在重新啟動期間重新加載它們,tomcat8如檔案中所述,您可以在檔案中src/main/resources添加META-INF/context.xml。在里面context.xml你應該添加行<Manager pathname="" />。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520702.html
標籤:爪哇春天弹簧靴验证
上一篇:如何驗證MS圖形請求?
