Spring Security极简入门三部曲(中篇)

大家好,我是白泽。通过上篇的学习,我们实现了一个简单的基于角色验证的小demo,但是不足之处在于用户和角色的信息我们写死在了内存中,而实际项目中必然是写在数据库里的,但是在将数据存入数据库之前,为了让你更深入理解Spring Security授权的验证流程,我需要为你介绍一些关键的接口和类(很遗憾这一部分无法完全避免),如果你只想继续学习Spring Security的使用,直接跳到demo时刻部分吧!

验证流程

Authentication接口

用户在前端输入的登陆信息传入后台后将封装入一个Authentication接口的实现类,它作为认证和授权的对象穿过整个过滤器链,反过来我们也能从Authentication实现类中取出用户账户的相关信息(用户名、密码、获取的权限等) Authentication实现类的获取方法: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;
}

过滤器链

Spring Security框架核心有一个ProviderManager类,点开它的源码,它有一个List providers属性,这个List集合中就是存放着一个个AuthenticationProvider的实现类(定义了一个个权限验证的规则),这个List集合就组成了过滤器链

AuthenticationProvider接口:

public interface AuthenticationProvider {
Authentication authenticate(Authentication var1) throws AuthenticationException; boolean supports(Class<?> var1);
}

上面提到,ProviderManager实例的providers属性存放了AuthenticationProvider接口的实现类集合,而AuthenticationProvider实现类就是实现权限验证流程的关键,它主要需要实现AuthenticationProvider接口的authenticate()方法,这个方法接收一个Authentication实例,返回一个Authentication实例

结合上面那张ProviderManager的图,你是不是就理解过滤器链是如何工作的了?(一开始就提到了用户登陆之后,将数据封装为一个Authentication实例,并由这个实例通过整个过滤器链进行验证,而此时AuthenticationProvider接口的实现类的authenticate()方法不就实现了接收一个Authentication实例,返回一个Authentication实例吗?一个个AuthenticationProvider实现类组合在一起就得到了链式的验证流程

demo时刻

需要实现的功能:

  1. demo2保留demo1的所有功能,github项目地址

  2. 自定义一个验证器加入过滤器链(实现:当用户使用baize账户登陆时,无论密码是什么,都将获取USER和ADMIN权限)

代码讲解

事实上我们只新建了AuthenticationProvider接口的实现类BaiZeAuthenticationProvider,去重写它的两个方法,自定义了一个验证器。并在SecurityConfiguration类中完成注入(相当于自定义过滤器加入过滤器链)

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
//从authentication实例中获取用户名和密码(这个authentication实例贯穿流程始终)
String username = authentication.getName();
String password = authentication.getCredentials().toString();
if (username.equals("baize")) {
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN")); //ROLE_ADMIN写法是固定的
authorities.add(new SimpleGrantedAuthority("ROLE_USER")); //ROLE_USER写法是固定的
return new UsernamePasswordAuthenticationToken(username, password, authorities);
} else {
return null;
}
}

小结

  1. 很抱歉我依旧没有为你讲解如何将用户、角色等数据存入数据库中,本节更多是介绍了Spring Security的验证流程,但相信你如果真的结合demo2学了下来,你的收获一定不小
  2. 我们自定义了一个验证器并将其加入过滤器链使黑客baize账户获取两个权限并完成登陆
  3. 白泽将在下一篇真正开始将数据存入数据库并构成第三个demo,敬请期待吧~
  4. 欢迎评论区留言

Spring Security极简入门三部曲(中篇)的更多相关文章

  1. Spring Security极简入门三部曲(上篇)

    目录 Spring Security极简入门三部曲(上篇) 写在前面 为什么要用Spring Security 数据库设计 demo时刻 核心代码讲解 小结 Spring Security极简入门三部 ...

  2. ElasticSearch极简入门总结

    一,目录 安装es 项目添加maven依赖 es客户端组件注入到spring容器中 es与mysql表结构对比 索引的删除创建 文档的crud es能快速搜索的核心-倒排索引 基于倒排索引的精确搜索. ...

  3. Git 极简入门教程学习笔记

    Git 极简入门教程  http://rogerdudler.github.io/git-guide/index.zh.html 测试用 https://github.com/xxx/BrnShop. ...

  4. .Net Core in Docker极简入门(下篇)

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 Docker-Compose 代码修改 yml file up & down 镜像仓库 最后 前言 上一篇[. ...

  5. 【Java杂货铺】用Security做权限极简入门

    原来大多数单体项目都是用的shiro,随着分布式的逐渐普及以及与Spring的天生自然的结合.Spring Security安全框架越受大家的青睐.本文会教你用SpringSecurity设计单项目的 ...

  6. Spring Security Web应用入门环境搭建

    在使用Spring Security配置Web应用之前,首先要准备一个基于Maven的Spring框架创建的Web应用(Spring MVC不是必须的),本文的内容都是基于这个前提下的. pom.xm ...

  7. Spring Security简介与入门Demo

    1:Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配 ...

  8. springboot集成spring security安全框架入门篇

    一. :spring security的简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下 ...

  9. Spring Security 从配置入门 学习讲解。万恶之源------------web.xml

    这段时间,工作闲了下来,接触了Spring Security,对于我一个基础很差的人来说,无疑是个挑战啊. 经过一段时间的摸索,终于有了点眉目,在这里,要特别感谢http://blog.csdn.ne ...

随机推荐

  1. EFCodeFirst属性映射约定

    EFCodeFirst属性映射约定 EFCodeFirst 属性映射约定 CodeFirst与数据表之间得映射方式又两种:Data Annotation和Fluent API 默认约定: 表名为类名的 ...

  2. Python3.x 基础练习题100例(51-60)

    练习51: 题目: 学习使用 按位与(&) . 分析: 0&0=0; 0&1=0; 1&0=0; 1&1=1. 程序: if __name__ == '__ma ...

  3. 中小企业上云首选,华为云全新云服务器S6性能评测分析

    转: 中小企业上云首选,华为云全新云服务器S6性能评测分析 [小宅按]今天,华为云全新弹性云服务器ECS通用计算型云服务器S6(以下简称为"华为云S6云服务器")正式发布,至顶网云 ...

  4. ZooTeam 前端周刊|第 111期

    转: ZooTeam 前端周刊|第 111期 ZooTeam 前端周刊|第 111期 浏览更多往期周刊,请访问: https://weekly.zoo.team 基于Vue的前端架构,我做了这15点 ...

  5. 学习版pytest内核测试平台开发万字长文入门篇

    前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...

  6. go中waitGroup源码解读

    waitGroup源码刨铣 前言 WaitGroup实现 noCopy state1 Add Wait 总结 参考 waitGroup源码刨铣 前言 学习下waitGroup的实现 本文是在go ve ...

  7. R绘图(3): 散点图添加文本注释

    这里以火山图为例进行说明,在转录组分析中,火山图是很常见的一类图,纵轴表示p_value,横轴表示log (fold change).单一的散点图绘制很简单,火山图比较难处理的地方就是一些基因的注释, ...

  8. MySQL数据库之一

    数据库简介 数据库分类 关系型数据库(SQL):(狭义可以理解为行和列) MySQL,Oracle,Sql Server, DB2 通过表和表之间,行和列之间的关系进行存储 非关系型数据库(NoSQL ...

  9. vue+lib-flexible实现大小屏幕,超大屏幕的适配展示。

    p.p1 { margin: 0; font: 12px "PingFang SC" } span.s1 { font: 12px "Helvetica Neue&quo ...

  10. vue 仿zTree折叠树

    需求: vue实现仿zTree折叠树,此文章仅作为记录文档. 实现: <template> <div class="line-tree"> <div ...