核心處理流程java
1:當一個用戶登陸時,會先執行身份認證。
spring
2:若是身份認證未經過,則會要求用戶從新認證。數據庫
3:若是身份認證經過,則會調用角色管理器判斷它是否能夠訪問。安全
這裏若是咱們須要使用數據庫中數據進行身份認證,則須要自定義用戶登陸功能。Spring Security爲咱們提供的UsrtDetailsService接口。ide
package org.springframework.security.core.userdetails; public interface UserDetailsService { UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException; }
UserDetails.javaspa
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,用戶的憑證都會視爲無效。對象
Authenticationblog
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對象,與其它組件進行共享。ip