Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security

 

Java Spring Boot VS .NetCore (一)來一個簡單的 Hello Worldhtml

Java Spring Boot VS .NetCore (二)實現一個過濾器Filter數據庫

Java Spring Boot VS .NetCore (三)Ioc容器處理安全

Java Spring Boot VS .NetCore (四)數據庫操做 Spring Data JPA vs EFCoreapp

Java Spring Boot VS .NetCore (五)MyBatis vs EFCore異步

Java Spring Boot VS .NetCore (六) UI thymeleaf vs cshtmlui

Java Spring Boot VS .NetCore (七) 配置文件spa

Java Spring Boot VS .NetCore (八) Java 註解 vs .NetCore Attributecode

Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Securityhtm

Java Spring Boot VS .NetCore (十) Java Interceptor vs .NetCore Interceptor中間件

Java Spring Boot VS .NetCore (十一)自定義標籤 Java Tag Freemarker VS .NetCore Tag TagHelper

談到安全,如如今市面上有的 OAuth2 \ OIDC -OpenId Connect ,身份認證、受權等,下面先來講下Java Security

這一塊的東西很是多複雜,不能是Spring Security 仍是 .NetCore Security,一點一點的比較說明

Spring Security

組成部分:

SecurityContextHolder, 提供幾種訪問 SecurityContext的方式。

SecurityContext, 保存Authentication信息和請求對應的安全信息。

Authentication, 展現Spring Security特定的主體。

GrantedAuthority, 反應,在應用程序範圍你,賦予主體的權限。

UserDetails,經過你的應用DAO,提供必要的信息,構建Authentication對象。

UserDetailsService, 建立一個UserDetails,傳遞一個 String類型的用戶名(或者證書ID或其餘).

Spring Security 安全種的 SecurityContextHolder 對象 與 .NetCore中的 HttpContext上下對象 針對 Security這塊  相似,固然.NetCore中的HttpContext 還有其餘職責,這裏就 HttpContext Authentication 說事

SecurityContextHolder:爲咱們提供了 獲取 SecurityContext的上下文對象及策略相關,這裏根據不一樣的策略獲取獲取到三種:

ThreadLocalSecurityContextHolderStrategy

InheritableThreadLocalSecurityContextHolderStrategy

GlobalSecurityContextHolderStrategy

固然也能夠自定義策略處理,有單獨的自定處理

else {
            try {
                Class<?> clazz = Class.forName(strategyName);
                Constructor<?> customStrategy = clazz.getConstructor();
                strategy = (SecurityContextHolderStrategy)customStrategy.newInstance();
            } catch (Exception var2) {
                ReflectionUtils.handleReflectionException(var2);
            }

SecurityContext: 經過這個對象咱們能夠獲取到 受權信息

SecurityContextHolder.getContext().getAuthentication()
public interface Authentication extends Principal, Serializable {
    Collection<? extends GrantedAuthority> getAuthorities();

    Object getCredentials();

    Object getDetails();

    Object getPrincipal();

    boolean isAuthenticated();

    void setAuthenticated(boolean var1) throws IllegalArgumentException;
}

這裏就跟 .NetCore中的 HttpContext.User.Identity 身份信息一致 

Spring中 Security getAuthentication 獲得了受權身份信息,那麼這個身份 有沒有受權,是什麼樣的身份信息呢?這裏都能獲得相關的處理

那麼獲取想當前訪問人的信息 

Object principal=  SecurityContextHolder.getContext().getAuthentication().getPrincipal();

這裏跟.NetCore  Authentication下的 方法類是 ,這個下面也封裝了 Principal (ClaimsPrincipal 類型),固然對外部也提供了 那就是 User強轉 ClaimsPrincipal 

 public abstract Task<AuthenticateInfo> GetAuthenticateInfoAsync

看下.NetCore下面的強轉:

  var user = HttpContext.User as ClaimsPrincipal;

這點其實在Spring 裏面也存在這個處理 看到 getPrincipal() 獲取去當事人信息的時候獲得的是 Object對象 並非 UserDeatils這個 對象

因此 Spring Security 裏面 也有這麼一出 

Object principal=  SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        if (principal instanceof UserDetails) {
            String username = ((UserDetails)principal).getUsername();
        } else {
            String username = principal.toString();
        }

這裏跟.NetCore中的擴展登陸信息同樣 須要處理 當事人的身份信息,這我用.NeCore中 Windows 身份當事人信息來舉例子

if (result?.Principal is WindowsPrincipal wp)
 {
 
 id.AddClaim(new Claim(JwtClaimTypes.Subject, wp.Identity.Name));
}

這一點跟上面的Spring Security 是一樣的原理 

 

.NetCore 

首先拋開Session這種登陸處理,這裏介紹的是 Authentication認證,下面簡單介紹下

AuthenticationBuilder :建立認證
AuthenticationSchemeOptions :認證的參數
AuthenticationHandler :認證處理
AuthenticationMiddleware : 認證中間件

.NetCore下 首先

添加認證服務給出參數

services.AddAuthentication(
              options =>
              {
                  options.DefaultScheme = "Cookies";
                 // options.DefaultChallengeScheme = "oidc";
               
              })

而後添加受權認證的中間件,說有受權都是中間件來處理,這裏能夠去看中間件的原理,處理完成後會把信息寫入HttpContext上下文對象中的身份認證信息,同時暴露對HttpContext的安全訪問

 app.UseAuthentication();

代碼中經過 SignInAsync、SignOutAsync 處理 (這裏是異步) 這些方法暴露給了Httpcontext 同時也暴露給了 AuthenticationManager  對象

SignIn 會把經過本地驗證後的信息寫入認證相關的對象中,同時中間件對HttpContext上下問提供安全訪問

因此在代碼中咱們通常這樣處理:這裏提供認證管理 只讀的安全訪問對象操做

public abstract AuthenticationManager Authentication { get; }

同時還擴展暴露了 身份信息

public abstract ClaimsPrincipal User { get; set; }

這個玩意是用來幹什麼的呢?其實就是爲了咱們獲取認證的身份信息

能夠看下這個下面的身份信息,下面有IsAuthenticated 、Name 、AuthenticationType

HttpContext.User.Identity

IsAuthenticated :這個用戶的身份 是否定證

Name: 這個用戶的身份 是誰 是哪一個人

AuthenticationType:身份類型

 

這一篇就說道這裏,可能說的不夠詳細~

相關文章
相關標籤/搜索