谈到安全,如现在市面上有的 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 extendsPrincipal, Serializable {
Collection extends GrantedAuthority>getAuthorities();
Object getCredentials();
Object getDetails();
Object getPrincipal();booleanisAuthenticated();void setAuthenticated(boolean var1) throwsIllegalArgumentException;
}
这里就跟 .NetCore中的 HttpContext.User.Identity 身份信息一致
Spring中 Security getAuthentication 得到了授权身份信息,那么这个身份 有没有授权,是什么样的身份信息呢?这里都能得到相关的处理
那么获取想当前访问人的信息
Object principal= SecurityContextHolder.getContext().getAuthentication().getPrincipal();
这里跟.NetCore Authentication下的 方法类是 ,这个下面也封装了 Principal (ClaimsPrincipal 类型),当然对外部也提供了 那就是 User强转 ClaimsPrincipal
public abstract Task GetAuthenticateInfoAsync
看下.NetCore下面的强转:
var user = HttpContext.User as ClaimsPrincipal;
这点其实在Spring 里面也存在这个处理 看到 getPrincipal() 获取去当事人信息的时候得到的是 Object对象 并不是 UserDeatils这个 对象
所以 Spring Security 里面 也有这么一出
Object principal=SecurityContextHolder.getContext().getAuthentication().getPrincipal();if (principal instanceofUserDetails) {
String username=((UserDetails)principal).getUsername();
}else{
String username=principal.toString();
}
这里跟.NetCore中的扩展登录信息一样 需要处理 当事人的身份信息,这我用.NeCore中 Windows 身份当事人信息来举例子
if (result?.Principal is WindowsPrincipal wp)
{
id.AddClaim(newClaim(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:身份类型
这一篇就说道这里,可能说的不够详细~