标签:win 添加 boot builder 程序 reflect 只读 身份认证 比较
谈到安全,如现在市面上有的 OAuth2 \ OIDC -OpenId Connect ,身份认证、授权等,下面先来说下Java Security
这一块的东西非常多复杂,不能是Spring Security 还是 .NetCore 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 是同样的原理
首先抛开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:身份类型
这一篇就说道这里,可能说的不够详细~
Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
标签:win 添加 boot builder 程序 reflect 只读 身份认证 比较
原文地址:https://www.cnblogs.com/liyouming/p/9488776.html