zoukankan      html  css  js  c++  java
  • Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security

     

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World

    Java Spring Boot VS .NetCore (二)实现一个过滤器Filter

    Java Spring Boot VS .NetCore (三)Ioc容器处理

    Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore

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

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

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

    Java Spring Boot VS .NetCore (八) Java 注解 vs .NetCore Attribute

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

    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:身份类型

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

  • 相关阅读:
    剑指Offer--复杂链表的复制
    剑指offer--第43题 1~n整数中1出现的次数
    剑指Offer--第50题 第一次只出现一次的字符
    剑指offer--扑克牌顺子
    MySQL免安装使用教程
    TortoiseGit的使用参考
    剑指Offer-- 第58题 翻转字符串
    剑指Offer-- 第45题 把数组排成最小数
    剑指Offer-- 第49题 丑数
    SpringBoot-data-jpa的简单使用
  • 原文地址:https://www.cnblogs.com/liyouming/p/9488776.html
Copyright © 2011-2022 走看看