<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringSecurity 常見面試題匯總

          共 4251字,需瀏覽 9分鐘

           ·

          2023-06-20 09:44

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 5 分鐘。

          來自:blog.csdn.net/qq_33129875/article/details/129286417

          1.什么是Spring Security?核心功能?

          Spring Security是一個基于Spring框架的安全框架,提供了完整的安全解決方案,包括認證、授權(quán)、攻擊防護等功能。
          其核心功能包括:
          • 認證:提供了多種認證方式,如表單認證、HTTP Basic認證、OAuth2認證等,可以與多種身份驗證機制集成。

          • 授權(quán):提供了多種授權(quán)方式,如角色授權(quán)、基于表達式的授權(quán)等,可以對應(yīng)用程序中的不同資源進行授權(quán)。

          • 攻擊防護:提供了多種防護機制,如跨站點請求偽造(CSRF)防護、注入攻擊防護等。

          • 會話管理:提供了會話管理機制,如令牌管理、并發(fā)控制等。

          • 監(jiān)視與管理:提供了監(jiān)視與管理機制,如訪問日志記錄、審計等。

          Spring Security通過配置安全規(guī)則和過濾器鏈來實現(xiàn)以上功能,可以輕松地為Spring應(yīng)用程序提供安全性和保護機制。

          2.Spring Security的原理?

          Spring Security是一個基于Spring框架的安全性認證和授權(quán)框架,它提供了全面的安全性解決方案,可以保護Web應(yīng)用程序中的所有關(guān)鍵部分。
          Spring Security的核心原理是攔截器(Filter)。Spring Security會在Web應(yīng)用程序的過濾器鏈中添加一組自定義的過濾器,這些過濾器可以實現(xiàn)身份驗證和授權(quán)功能。當(dāng)用戶請求資源時,Spring Security會攔截請求,并使用配置的身份驗證機制來驗證用戶身份。如果身份驗證成功,Spring Security會授權(quán)用戶訪問所請求的資源。
          Spring Security的具體工作原理如下:
          1. 用戶請求Web應(yīng)用程序的受保護資源。

          2. Spring Security攔截請求,并嘗試獲取用戶的身份驗證信息。

          3. 如果用戶沒有經(jīng)過身份驗證,Spring Security將向用戶顯示一個登錄頁面,并要求用戶提供有效的憑據(jù)(用戶名和密碼)。

          4. 一旦用戶提供了有效的憑據(jù),Spring Security將驗證這些憑據(jù),并創(chuàng)建一個已認證的安全上下文(SecurityContext)對象。

          5. 安全上下文對象包含已認證的用戶信息,包括用戶名、角色和授權(quán)信息。

          6. 在接下來的請求中,Spring Security將使用已經(jīng)認證的安全上下文對象來判斷用戶是否有權(quán)訪問受保護的資源。

          7. 如果用戶有權(quán)訪問資源,Spring Security將允許用戶訪問資源,否則將返回一個錯誤信息。

          3.有哪些控制請求訪問權(quán)限的方法?

          在Spring Security中,可以使用以下方法來控制請求訪問權(quán)限:
          • permitAll()?:允許所有用戶訪問該請求,不需要進行任何身份驗證。

          • denyAll()?:拒絕所有用戶訪問該請求。

          • anonymous()?:允許匿名用戶訪問該請求。

          • authenticated()?:要求用戶進行身份驗證,但是不要求用戶具有任何特定的角色。

          • hasRole(String role)?:要求用戶具有特定的角色才能訪問該請求。

          • hasAnyRole(String... roles)?:要求用戶具有多個角色中的至少一個角色才能訪問該請求。

          • hasAuthority(String authority)?:要求用戶具有特定的權(quán)限才能訪問該請求。

          • hasAnyAuthority(String... authorities)?:要求用戶具有多個權(quán)限中的至少一個權(quán)限才能訪問該請求。

          可以將這些方法應(yīng)用于Spring Security的配置類或者在Spring Security注解中使用。

          4.hasRole 和 hasAuthority 有區(qū)別嗎?

          在Spring Security中,hasRole和hasAuthority都可以用來控制用戶的訪問權(quán)限,但它們有一些細微的差別。
          hasRole方法是基于角色進行訪問控制的。它檢查用戶是否有指定的角色,并且這些角色以"ROLE_"前綴作為前綴(例如"ROLE_ADMIN")。
          hasAuthority方法是基于權(quán)限進行訪問控制的。它檢查用戶是否有指定的權(quán)限,并且這些權(quán)限沒有前綴。
          因此,使用hasRole方法需要在用戶的角色名稱前添加"ROLE_"前綴,而使用hasAuthority方法不需要這樣做。
          例如,假設(shè)用戶有一個角色為"ADMIN"和一個權(quán)限為"VIEW_REPORTS",可以使用以下方式控制用戶對頁面的訪問權(quán)限:

          .antMatchers("/admin/**").hasRole("ADMIN")
          .antMatchers("/reports/**").hasAuthority("VIEW_REPORTS")

          在這個例子中,只有具有"ROLE_ADMIN"角色的用戶才能訪問/admin/路徑下的頁面,而具有"VIEW_REPORTS"權(quán)限的用戶才能訪問/reports/路徑下的頁面。

          5.如何對密碼進行加密?

          在 Spring Security 中對密碼進行加密通常使用的是密碼編碼器(PasswordEncoder)。PasswordEncoder?的作用是將明文密碼加密成密文密碼,以便于存儲和校驗。Spring Security 提供了多種常見的密碼編碼器,例如?BCryptPasswordEncoderSCryptPasswordEncoderStandardPasswordEncoder?等。
          以?BCryptPasswordEncoder?為例,使用步驟如下:
          1.在 pom.xml 文件中添加?BCryptPasswordEncoder?的依賴:

          <dependency>
          ????<groupId>org.springframework.securitygroupId>
          ????<artifactId>spring-security-cryptoartifactId>
          ????<version>5.6.1version>
          dependency>

          2.在 Spring 配置文件中注入?BCryptPasswordEncoder

          @Configuration
          public?class?SecurityConfig?extends?WebSecurityConfigurerAdapter?{
          ????
          ????@Bean
          ????public?PasswordEncoder?passwordEncoder()?{
          ????????return?new?BCryptPasswordEncoder();
          ????}
          ????
          ????//?...
          }

          3.在使用密碼的地方調(diào)用?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基于用戶名和密碼的認證模式流程?

          請求的用戶名密碼可以通過表單登錄,基礎(chǔ)認證,數(shù)字認證三種方式從HttpServletRequest中獲得,用于認證的數(shù)據(jù)源策略有內(nèi)存,數(shù)據(jù)庫,ldap,自定義等。
          攔截未授權(quán)的請求,重定向到登錄頁面的過程:
          • 當(dāng)用戶訪問需要授權(quán)的資源時,Spring Security會檢查用戶是否已經(jīng)認證(即是否已登錄),如果沒有登錄則會重定向到登錄頁面。

          • 重定向到登錄頁面時,用戶需要輸入用戶名和密碼進行認證。

          表單登錄的過程:
          1. 用戶在登錄頁面輸入用戶名和密碼,提交表單。

          2. Spring Security的UsernamePasswordAuthenticationFilter攔截表單提交的請求,并將用戶名和密碼封裝成一個Authentication對象。

          3. AuthenticationManager接收到Authentication對象后,會根據(jù)用戶名和密碼查詢用戶信息,并將用戶信息封裝成一個UserDetails對象。

          4. 如果查詢到用戶信息,則將UserDetails對象封裝成一個已認證的Authentication對象并返回,如果查詢不到用戶信息,則拋出相應(yīng)的異常。

          5. 認證成功后,用戶會被重定向到之前訪問的資源。如果之前訪問的資源需要特定的角色或權(quán)限才能訪問,則還需要進行授權(quán)的過程。

          6. Spring Security的認證流程大致可以分為兩個過程,首先是用戶登錄認證的過程,然后是用戶訪問受保護資源時的授權(quán)過程。在認證過程中,用戶需要提供用戶名和密碼,Spring Security通過UsernamePasswordAuthenticationFilter將用戶名和密碼封裝成Authentication對象,并交由AuthenticationManager進行認證。如果認證成功,則認證結(jié)果會存儲在SecurityContextHolder中。在授權(quán)過程中,Spring Security會檢查用戶是否有訪問受保護資源的權(quán)限,如果沒有則會重定向到登錄頁面進行認證。

          7. 攔截未授權(quán)的請求,重定向到登錄頁面

          表單登錄的過程,進行賬號密碼認證

          推薦閱讀:

          Linus,喬布斯,比爾蓋茨,扎克伯格等大佬的辦公桌什么樣?

          為什么不推薦使用 MyBatis 二級緩存?

          互聯(lián)網(wǎng)初中高級大廠面試題(9個G)

          內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!

          ?戳閱讀原文領(lǐng)取!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?

          瀏覽 21
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩精品视频一区二区三区 | 丁香五月天.激情视频 | 骚逼软件黑人大屌 | 国产一卡在线 | 3www.男人的天堂 |