上面代碼片段中要注意的另一個項目是您可以從`Authentication`對象獲取主體。 主體只是一個對象。 大多數情況下,這可以轉換為`UserDetails`對象。 `UserDetails`是Spring Security中的核心接口。 它代表一個主體,但是以可擴展和特定于應用程序的方式。 將`UserDetails`視為您自己的用戶數據庫與`SecurityContextHolder`中所需的適配器。 作為來自您自己的用戶數據庫的東西的表示,通常您會將UserDetails轉換為您的應用程序提供的原始對象,因此您可以調用特定于業務的方法(如`getEmail(), getEmployeeNumber()`等)。
到現在為止你可能想知道,所以我什么時候提供UserDetails對象? 我怎么做? 我以為你說這個東西是聲明性的,我不需要編寫任何Java代碼 - 是什么給出的? 簡短的回答是有一個名為`UserDetailsService`的特殊接口。 此接口上唯一的方法接受基于`String`的用戶名參數并返回`UserDetails`:
~~~
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
~~~
這是在Spring Security中為用戶加載信息的最常用方法,你會看到它在整個框架中需要有關用戶信息的使用。
在成功進行身份驗證后,`UserDetails`用于構建存儲在`SecurityContextHolder`中的`Authentication`對象(詳見下文)。 好消息是我們提供了許多`UserDetailsService`實現,包括一個使用內存映射(`InMemoryDaoImpl`)和另一個使用JDBC(`JdbcDaoImpl`)的實現。 但是,大多數用戶傾向于自己編寫,他們的實現通常只是基于代表其 employees, customers,或users 的現有數據訪問對象(DAO)之上。 記住,無論你的`UserDetailsService`返回什么,總是可以使用上面的代碼片段從`SecurityContextHolder`獲得。
>關于`UserDetailsService`經常會有一些混亂。 它純粹是用戶數據的DAO,除了將數據提供給框架內的其他組件之外,不執行任何其他功能。 特別是,它不會對用戶進行身份驗證,這是由`AuthenticationManager`完成的。 在許多情況下,如果您需要自定義身份驗證過程,則直接實現`AuthenticationProvider`會更有意義。
- 架構
- 9.技術概述
- 9.1 運行環境
- 9.2 核心組件
- 9.2.1 SecurityContextHolder, SecurityContext and Authentication Objects
- 9.2.2 The UserDetailsService
- 9.2.3 GrantedAuthority
- 9.2.4 總結
- 9.3 驗證
- 9.3.1 在Spring Security中驗證是什么
- 9.3.2 直接設置SecurityContextHolder內容
- 9.4 web應用中的驗證
- 9.4.1 ExceptionTranslationFilter
- 9.4.2 AuthenticationEntryPoint
- 9.4.3 驗證機制
- 9.4.4 在請求之間存儲SecurityContext
- 9.5 Spring Security中的訪問控制(授權)
- 9.5.1 Security and AOP Advice
- 9.5.2 Secure Objects and the AbstractSecurityInterceptor
- 什么是配置屬性
- RunAsManager
- AfterInvocationManager
- 擴展安全對象模型
- 9.6 本地化
- 10 核心服務
- 10.1 The AuthenticationManager, ProviderManager and AuthenticationProvider
- 10.1.1 成功驗證時擦除憑據
- 10.1.2 DaoAuthenticationProvider
- 10.2 UserDetailsService實現
- 10.2.1 In-Memory Authentication
- 10.2.2 JdbcDaoImpl
- Authority Groups
- 10.3 Password Encoding
- 10.3.1 密碼發展史
- 10.3.2 DelegatingPasswordEncoder
- 密碼存儲格式
- 密碼編碼
- 密碼比對
- 入門體驗
- 排除故障
- 10.3.3 BCryptPasswordEncoder
- 10.3.4 Pbkdf2PasswordEncoder
- 10.3.5 SCryptPasswordEncoder
- 10.3.6 其他PasswordEncoders
- 10.4 Jackson的支持
- 11 測試方法安全
- 12 集成spring mvc測試
- 13 webflux支持
- 14 安全過濾器鏈
- 14.1 DelegatingFilterProxy
- 14.2 FilterChainProxy
- 14.2.1 繞過過濾鏈
- 14.3 過濾器順序
- 14.4 匹配請求和http防火墻
- 14.5 與其他基于過濾器的框架一起使用
- 14.6 Advanced Namespace Configuration
- 15. 核心的安全過濾器
- 15.1 FilterSecurityInterceptor
- 15.2 ExceptionTranslationFilter
- 15.3 SecurityContextPersistenceFilter
- 15.4 UsernamePasswordAuthenticationFilter