核心處理流程
1:當一個用戶登錄時,會先執行身份認證。
2:如果身份認證未通過,則會要求用戶重新認證。
3:如果身份認證通過,則會調用角色管理器判斷它是否可以訪問。
這裏如果我們需要使用數據庫中數據進行身份認證,則需要自定義用戶登錄功能。Spring Security爲我們提供的UsrtDetailsService接口。
package org.springframework.security.core.userdetails; public interface UserDetailsService { UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException; }
UserDetails.java
package org.springframework.security.core.userdetails; import java.io.Serializable; import java.util.Collection; import org.springframework.security.core.GrantedAuthority; public interface UserDetails extends Serializable { Collection<? extends GrantedAuthority> getAuthorities(); // 權限集合 String getPassword(); // 密碼 String getUsername(); // 用戶名 boolean isAccountNonExpired(); // 賬號是否沒有過期 boolean isAccountNonLocked(); // 賬戶是否沒有被鎖定 boolean isCredentialsNonExpired(); // 證書是否沒有過期 boolean isEnabled(); // 賬戶是否有效 }
UserDetails中的任何一個方法返回false,用戶的憑證都會視爲無效。
Authentication
package org.springframework.security.core; import java.io.Serializable; import java.security.Principal; import java.util.Collection; public interface Authentication extends Principal, Serializable { Collection<? extends GrantedAuthority> getAuthorities(); // 權限集合 Object getCredentials(); // 獲取憑證 Object getDetails(); // 獲取認證一些額外信息 Object getPrincipal(); // 過去認證的實體 boolean isAuthenticated(); // 是否通過認證 void setAuthenticated(boolean var1) throws IllegalArgumentException; }
實際上Spring Security進行安全訪問控制用戶信息的對象是Authentication。
Authentication有已認證和未認證兩種狀態,在作爲參數傳入認證管理器的時候,它是一個未認證的對象,它從客戶端獲取用戶名/密碼,並由系統自動構成一個Authentication對象;而UserDetails代表的是一個用戶安全信息的源,這個源可以是從數據庫獲取,Spring Security要做的就是將這個爲認證的Authentication對象和UserDetails進行匹配,成功後將UserDetails中的用戶權限信息拷貝到Authentication只,組成一個完整的Authentication對象,與其它組件進行共享。