SpringSecurity 常見面試題匯總
閱讀本文大概需要 5 分鐘。
來自:blog.csdn.net/qq_33129875/article/details/129286417
1.什么是Spring Security?核心功能?
認證:提供了多種認證方式,如表單認證、HTTP Basic認證、OAuth2認證等,可以與多種身份驗證機制集成。
授權(quán):提供了多種授權(quán)方式,如角色授權(quán)、基于表達式的授權(quán)等,可以對應(yīng)用程序中的不同資源進行授權(quán)。
攻擊防護:提供了多種防護機制,如跨站點請求偽造(CSRF)防護、注入攻擊防護等。
會話管理:提供了會話管理機制,如令牌管理、并發(fā)控制等。
監(jiān)視與管理:提供了監(jiān)視與管理機制,如訪問日志記錄、審計等。
2.Spring Security的原理?

用戶請求Web應(yīng)用程序的受保護資源。
Spring Security攔截請求,并嘗試獲取用戶的身份驗證信息。
如果用戶沒有經(jīng)過身份驗證,Spring Security將向用戶顯示一個登錄頁面,并要求用戶提供有效的憑據(jù)(用戶名和密碼)。
一旦用戶提供了有效的憑據(jù),Spring Security將驗證這些憑據(jù),并創(chuàng)建一個已認證的安全上下文(SecurityContext)對象。
安全上下文對象包含已認證的用戶信息,包括用戶名、角色和授權(quán)信息。
在接下來的請求中,Spring Security將使用已經(jīng)認證的安全上下文對象來判斷用戶是否有權(quán)訪問受保護的資源。
如果用戶有權(quán)訪問資源,Spring Security將允許用戶訪問資源,否則將返回一個錯誤信息。
3.有哪些控制請求訪問權(quán)限的方法?
permitAll()?:允許所有用戶訪問該請求,不需要進行任何身份驗證。
denyAll()?:拒絕所有用戶訪問該請求。
anonymous()?:允許匿名用戶訪問該請求。
authenticated()?:要求用戶進行身份驗證,但是不要求用戶具有任何特定的角色。
hasRole(String role)?:要求用戶具有特定的角色才能訪問該請求。
hasAnyRole(String... roles)?:要求用戶具有多個角色中的至少一個角色才能訪問該請求。
hasAuthority(String authority)?:要求用戶具有特定的權(quán)限才能訪問該請求。
hasAnyAuthority(String... authorities)?:要求用戶具有多個權(quán)限中的至少一個權(quán)限才能訪問該請求。
4.hasRole 和 hasAuthority 有區(qū)別嗎?
ROLE_ADMIN")。VIEW_REPORTS",可以使用以下方式控制用戶對頁面的訪問權(quán)限:.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/reports/**").hasAuthority("VIEW_REPORTS")
ROLE_ADMIN"角色的用戶才能訪問/admin/路徑下的頁面,而具有"VIEW_REPORTS"權(quán)限的用戶才能訪問/reports/路徑下的頁面。5.如何對密碼進行加密?
PasswordEncoder)。PasswordEncoder?的作用是將明文密碼加密成密文密碼,以便于存儲和校驗。Spring Security 提供了多種常見的密碼編碼器,例如?BCryptPasswordEncoder、SCryptPasswordEncoder、StandardPasswordEncoder?等。BCryptPasswordEncoder?為例,使用步驟如下:BCryptPasswordEncoder?的依賴:<dependency>
????<groupId>org.springframework.securitygroupId>
????<artifactId>spring-security-cryptoartifactId>
????<version>5.6.1version>
dependency>
BCryptPasswordEncoder:@Configuration
public?class?SecurityConfig?extends?WebSecurityConfigurerAdapter?{
????
????@Bean
????public?PasswordEncoder?passwordEncoder()?{
????????return?new?BCryptPasswordEncoder();
????}
????
????//?...
}
passwordEncoder.encode()?方法對密碼進行加密,例如注冊時對密碼進行加密:@Service
public?class?UserServiceImpl?implements?UserService?{
?
????@Autowired
????private?PasswordEncoder?passwordEncoder;
?
????@Override
????public?User?register(User?user)?{
????????String?encodedPassword?=?passwordEncoder.encode(user.getPassword());
????????user.setPassword(encodedPassword);
????????//?...
????????return?user;
????}
?
????//?...
}
BCryptPasswordEncoder?對密碼進行加密的步驟。使用其他密碼編碼器的步驟類似,只需將?BCryptPasswordEncoder?替換為相應(yīng)的密碼編碼器即可。6.Spring Security基于用戶名和密碼的認證模式流程?
HttpServletRequest中獲得,用于認證的數(shù)據(jù)源策略有內(nèi)存,數(shù)據(jù)庫,ldap,自定義等。當(dāng)用戶訪問需要授權(quán)的資源時,Spring Security會檢查用戶是否已經(jīng)認證(即是否已登錄),如果沒有登錄則會重定向到登錄頁面。
重定向到登錄頁面時,用戶需要輸入用戶名和密碼進行認證。
用戶在登錄頁面輸入用戶名和密碼,提交表單。
Spring Security的
UsernamePasswordAuthenticationFilter攔截表單提交的請求,并將用戶名和密碼封裝成一個Authentication對象。AuthenticationManager接收到Authentication對象后,會根據(jù)用戶名和密碼查詢用戶信息,并將用戶信息封裝成一個UserDetails對象。如果查詢到用戶信息,則將UserDetails對象封裝成一個已認證的
Authentication對象并返回,如果查詢不到用戶信息,則拋出相應(yīng)的異常。認證成功后,用戶會被重定向到之前訪問的資源。如果之前訪問的資源需要特定的角色或權(quán)限才能訪問,則還需要進行授權(quán)的過程。
Spring Security的認證流程大致可以分為兩個過程,首先是用戶登錄認證的過程,然后是用戶訪問受保護資源時的授權(quán)過程。在認證過程中,用戶需要提供用戶名和密碼,Spring Security通過
UsernamePasswordAuthenticationFilter將用戶名和密碼封裝成Authentication對象,并交由AuthenticationManager進行認證。如果認證成功,則認證結(jié)果會存儲在SecurityContextHolder中。在授權(quán)過程中,Spring Security會檢查用戶是否有訪問受保護資源的權(quán)限,如果沒有則會重定向到登錄頁面進行認證。攔截未授權(quán)的請求,重定向到登錄頁面

推薦閱讀:
Linus,喬布斯,比爾蓋茨,扎克伯格等大佬的辦公桌什么樣?
互聯(lián)網(wǎng)初中高級大廠面試題(9個G) 內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)取!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?


