Spring Security(3):數據庫管理

核心處理流程

86f38c9e111e311cdd6dc9f4f5dc8f86.png


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對象,與其它組件進行共享。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章