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

谈到安全,如现在市面上有的 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:身份类型

这一篇就说道这里,可能说的不够详细~

猜你喜欢

转载自www.cnblogs.com/liyouming/p/9488776.html
今日推荐