建网站数据库,手机品牌排行榜,韩国优秀网站欣赏,服装加盟的网站建设前言#xff1a;
通过实践而发现真理#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识#xff0c;又从理性认识而能动地指导革命实践#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识#xff0c;这种形式#xff0c;循环往…前言
通过实践而发现真理又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识又从理性认识而能动地指导革命实践改造主观世界和客观世界。实践、认识、再实践、再认识这种形式循环往复以至无穷而实践和认识之每一循环的内容都比较地进到了高一级的程度 温故知新 正片
第四篇认识SpringSecurity认证框架下
第五篇 第四篇认识SpringSecurity认证框架下 标题为Access Currently Authenticated User——访问当前已验证的用户
在上一期我们体验官方的Security认证模型框架如何定义的
在这一期我们将体验SecurityContextHolder承担完登录认证后的内容
逻辑推演 认证完后的内容存储在SecurityContextHolder内的SecurityContext中的Authentication中 那么我们要读出存储在Authenticaiton的内容该怎么办
第一获取SecurityContext内容
第二获取Authentication的内容
第三获取详细信息
发现没这就是创建的倒用对比一下
第一通过SecurityContextHolder创建EMptyContext内容
第二创建Authenticaiton详细认证内容
第三将Authentication设置为Context内容
第四将Context内容设置为SecurityContextHolder内容
其中第三与第四可以合成一步但是在官方文档中是不建议这么做的因为会导致线程竞争 看到官方的示例
SecurityContext context SecurityContextHolder.getContext();
Authentication authentication context.getAuthentication();
String username authentication.getName();
Object principal authentication.getPrincipal();
Collection? extends GrantedAuthority authorities authentication.getAuthorities();
第一步获取SecurityContext ✔
第二步获取Authentication ✔
第三步针对需要的内容去获取剩下的三部分 ✔
对比自定义Context SecurityContext context SecurityContextHolder.createEmptyContext();
Authentication authentication new TestingAuthenticationToken(username, password, ROLE_USER);
context.setAuthentication(authentication);SecurityContextHolder.setContext(context);
第一步创建EmptyContext
第二步创建Authentication
第三步设置ContextHolder
在对比中我们可以发现Authenticaiton认证是基于SecurityContext的而SecurityContext是基于SecurityContextHolder
也是十分符合认证框架图SecurityContextHolder在最底层Authentication在最顶层在这一期我们将体验SecurityContextHolder在完成一个完整的认证循环后的内容
这么大费周章的去描述这个内容为了更好看懂下面这个BUG
在运行这段代码时我们碰见了Security第一个报错
Exception in thread main java.lang.NullPointerException: Cannot invoke org.springframework.security.core.Authentication.getName() because authentication is null
线程 “main” java.lang.NullPointerException 中出现异常无法调用 “org.springframework.security.core.Authentication.getName”因为 “authentication” 为 null
为什么会导致该内容为空的
因为SecurityContextHolder没接受到认证用户信息导致Context为空最终导致Authentication为空
知道了为什么报错就知道怎么解决
这里作者想到了三种
第一种SecurityContextHolder成功接受内容
第二种自定义一个登录认证代码完成SecurityContextHolder
这两种方法都离不开SecurityCOntextHolder因为没有Holder就没有Context懂不懂Security authentication认证地基含金量
实践
第一种让SecurityContextHolder成功接受内容 答案因为报错无法运行客户端导致无法接受信息死局
第二种自定义一个登入认证代码 答案由于作者水平导致无法实践
那这个就不能管了吗有一句话说的好发现问题是代码你有能力解决问题靠的是态度而不是技术
我就在第一种方法上修改了既然没办法直接调用因为Holder必为空也就是死局那我能不能让他先登录再去调用呢
结合上MVC框架哦懂了我们可以将这段内容编写成一个接口先完成登录功能再去调用接口接口再去完成Holder → context →Authentication的循环返回Context
理论可行实践开始 实践结果 打印出来了和创建时的差不多 差不多代表了代码也差不多
废话打印的都是基于Authenticaion的能差不多吗
疑问既然能打印出单独的属性那么我直接打印context可以吗
实践开始
内容SecurityContextImpl [AuthenticationUsernamePasswordAuthenticationToken [Principalorg.springframework.security.core.userdetails.User [Usernameuser, Password[PROTECTED], Enabledtrue, AccountNonExpiredtrue, CredentialsNonExpiredtrue, AccountNonLockedtrue, Granted Authorities[]], Credentials[PROTECTED], Authenticatedtrue, DetailsWebAuthenticationDetails [RemoteIpAddress127.0.0.1, SessionId1D1D1BFC6CA26B03307193822580EAAD], Granted Authorities[]]] Contest里面包含很多内容
既然可以打印这个不妨试试Authentication的全部GEt方法的内容
我们打印了Authentication的区别内容Context 发现没这个用户名和密码是不属于用户明细的
代码运行完了下面的说明没啥好看的总结下来就两个字勿动六个字勿动默认配置
总结第四篇上下
第一Security认证架构专业点模板阿框架阿都差不多一切基于SecurityContextHolderAuthentication基于Context
第二解决问题靠的是态度而不是能力