Spring Security极简入门三部曲(上篇)
Spring Security极简入门三部曲(上篇)
大家好,这里是白泽。最近学校里一个Spring Boot项目要用到Spring Security做安全相关的工作,好,没用过,那我先学一下吧。查阅了不少文章,上来就是一堆接口,实现类,过滤器链,超级高水平,我看不懂。摸索了两天终于有点感觉了,就写一篇两天前的我希望看到的博客吧
这篇博客能让你初步理解Spring Security框架执行的过程,并用于你的Spring Boot项目中,但如果需要精进这个框架,还需要你阅读更多源码等后续的学习
写在前面
代码在我的github中:github项目地址,本篇博客对应名为spring-security-demo1的项目文件
学这个框架,不管你是跟着别人的博客学,还是看视频学,不跟着写个小的demo,想学明白需要点天赋
你需要会用Spring Boot,以及一些基本的前端知识(html/css/js),包括thymeleaf模板框架的基础知识
MySQL数据库相关知识,以及Spring Boot整合Mybatis框架的使用
为什么要用Spring Security
你也知道Spring Security有两个功能,认证和授权,认证指的是验证用户名密码是否正确(登陆),但你学习这个框架的初衷是想做授权,比如想控制你项目中有些资源(页面)只有管理员能访问,有些资源则普通用户和管理员都能访问。又或者针对同一个资源,用户只有查看的权限,但是管理员有增、删、改、查的权限。
尽管我很想一下子就告诉你这个框架的用法,让你马上cv到自己的项目里,但结合我的学习经历,我认为,如果你刚开始接触权限相关的知识,那么你很可能需要先梳理一下你自己项目的数据库设计思路(因为用户、角色、权限最终都是存在数据库里的),所以别急,先往下看。
数据库设计

为了实现不同角色访问权限的控制,这里要用到至少5个表
用户表和角色表是多对多的关系,用来表示每个用户分别的是什么角色(如:A是用户,B是管理员),二者的关系存放在用户角色关系表中
角色表和权限表也是多对多的关系,用来表示每个角色有什么权限(如:对某资源,用户有查看权限,管理员有增加、删除、修改、查看权限),二者关系存放在角色权限关系表中
注意:在通篇博客中,如果我提到 ” 管理员有访问XX资源(主要指页面)的权限 “,这里的权限指的是访问这个资源的资格(它只限制了角色);而如果我提到 ” 管理员对XX资源有增、删、改、查的权限,而普通用户只有查看权限 “,(它不仅限制了角色还细分了不同角色对同一个资源的操作权限)。而权限表中存放的是记录是针对后者这种情况的(因此permission_code也可以理解为以某种操作处理某种资源的后端url是多少)
为了帮助理解,我拟了一张permission表(针对学生资源,有增、删、改、查四个权限,所以在permission表中有四条记录)

demo时刻
ps:spring-security-demo1将围绕用户表<->角色表展开(且将先不使用数据库),数据库的使用,以及角色表<->权限表部分将在后续博客讲解
实现功能:
- 网站分为首页、登陆页、用户页、管理员页、报错页
- 使用用户名密码登陆,登陆失败报错
- 首页、登陆页所有角色都能访问
- 用户页需要USER或ADMIN权限,管理员页需要ADMIN权限(权限不足时跳转至403页面)
- 如果用户没有登录,则访问需要权限的页面时自动跳转登录页面,登陆成功后自动跳转至访问的页面
- 别愣着了,快把项目克隆到本地并尝试运行呀!最好再自己新建一个项目跟着写一遍~
测试结果:
- github项目地址,点击主页跳转至登陆页面,输入定义好的用户名和密码
- 如果用户名或密码出错则在登陆页显示错误
- 如果登陆成功则跳转至/user(无论是用admin还是user登陆都是默认跳转至/user)
- 如果在登陆状态下用户为user,此时点击管理员页的连接会跳转至403(权限不足),而点击用户页则可以正常访问
- 如果登陆状态下用户为admin,此时点击管理员页和用户页都可以正常访问
- 点击退出登陆则清除登陆账户session记录,跳转至/login登陆页
- 如果一开始在未登录时点击用户页或管理员页,则会先跳转至登陆页提示登陆,输入信息后会自动跳回之前请求的用户页或者管理员页,但是,如果起初点击的是管理员页,而在提示输入登陆信息时输入了user的登陆信息,则在最终访问管理员页面时会出现403提示(因为user账户没有admin权限)
核心代码讲解
事实上,需要你编写的Spring Security相关代码其实只涉及到一个类中的不到二十行代码~,如果你只想知道怎么用,完全可以只看那个SecurityConfiguration配置类的代码

这个自定义的配置类继承了Spring Security提供的一个父类WebSecurityConfigurerAdapter,并重写了它的两个configure方法,第一个方法在程序运行时于内存中创建两个用户(用户名&密码)并赋予角色,我们前端的登陆就是去匹配这两个定义好的用户
user用户,密码为123(加密处理),赋予USER权限(角色)
admin用户,密码为123(加密处理),赋予USER和ADMIN权限(角色)
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
/**
* 在内存中创建一个名为 "user" 的用户,密码为 "123",拥有 "USER" 权限,密码使用BCryptPasswordEncoder加密
*/
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("user").password(new BCryptPasswordEncoder().encode("123")).roles("USER");
/**
* 在内存中创建一个名为 "admin" 的用户,密码为 "123",拥有 "USER" 和"ADMIN"权限
*/
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("admin").password(new BCryptPasswordEncoder().encode("123")).roles("USER","ADMIN");
}
第二个重写的方法定义了访问/user/路径下的所有资源需要USER权限(角色),访问/admin/路径下的所有资源需要ADMIN权限(角色)
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/","/index").permitAll()
.antMatchers("/user/**").hasRole("USER")
.antMatchers("/admin/**").hasRole("ADMIN")
.and()
.formLogin()
.loginPage("/login") //用户未登录时,访问任何需要权限的资源都转跳到该路径,即登录页面,此时登陆成功后会继续跳转到第一次访问的资源页面(相当于被过滤了一下)
.defaultSuccessUrl("/user") //登录认证成功后默认转跳的路径,意思时admin登录后也跳转到/user
.and()
.logout()
.logoutUrl("/logout") //退出登陆的路径,指定spring security拦截的注销url,退出功能是security提供的
.logoutSuccessUrl("/login");//用户退出后要被重定向的url
}
小结
- 在本demo中,我们未用到数据库去存放用户和角色的信息,这在极简入门中篇中将会讲解
- 此外我们也没有在代码中模拟对于某项资源不同角色有不同的操作权限,这在极简入门的下篇将会讲解
- 到此为止,你是否对用户登陆成功后,session中用户信息的存放感到好奇?过滤器链的作用详情又是是怎么样的?我们后面再做探讨
- 欢迎评论区留言
Spring Security极简入门三部曲(上篇)的更多相关文章
- Spring Security极简入门三部曲(中篇)
目录 Spring Security极简入门三部曲(中篇) 验证流程 Authentication接口 过滤器链 AuthenticationProvider接口: demo时刻 代码讲解 小结 Sp ...
- .Net Core in Docker极简入门(上篇)
目录 前言 开始 环境准备 Docker基础概念 Docker基础命令 Docker命令实践 构建Docker镜像 Dockerfile bulid & run 前言 Docker 是一个开源 ...
- .Net Core in Docker极简入门(下篇)
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 Docker-Compose 代码修改 yml file up & down 镜像仓库 最后 前言 上一篇[. ...
- ElasticSearch极简入门总结
一,目录 安装es 项目添加maven依赖 es客户端组件注入到spring容器中 es与mysql表结构对比 索引的删除创建 文档的crud es能快速搜索的核心-倒排索引 基于倒排索引的精确搜索. ...
- Git 极简入门教程学习笔记
Git 极简入门教程 http://rogerdudler.github.io/git-guide/index.zh.html 测试用 https://github.com/xxx/BrnShop. ...
- 【Java杂货铺】用Security做权限极简入门
原来大多数单体项目都是用的shiro,随着分布式的逐渐普及以及与Spring的天生自然的结合.Spring Security安全框架越受大家的青睐.本文会教你用SpringSecurity设计单项目的 ...
- Spring Security Web应用入门环境搭建
在使用Spring Security配置Web应用之前,首先要准备一个基于Maven的Spring框架创建的Web应用(Spring MVC不是必须的),本文的内容都是基于这个前提下的. pom.xm ...
- Spring Security简介与入门Demo
1:Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配 ...
- springboot集成spring security安全框架入门篇
一. :spring security的简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下 ...
随机推荐
- JavaSE实现IoC
作者:Grey 原文地址: 语雀 博客园 Java SE 提供了三种方式,可以实现IoC,分别为: Java Beans Java ServiceLoader SPI JNDI(Java Naming ...
- docker ssh秘钥免密登录
一.概述 有一台跳板机,已经实现了免密登录后端服务器.但是我写了一个django项目,它是运行在容器中的,也需要免密登录后端服务器. 虽然可以在容器中手动做一下免密登录,但是容器重启之后,之前做的设置 ...
- 华硕主板开机无法进入BIOS
先说下本人情况,自己组装的台式机,华硕TUF B550M-Plus (wifi)的主板,CPU是锐龙 4650G(带核显),其他配件不涉及问题就不提了. 原来用独显的时候,没啥问题,开机有品牌logo ...
- 微信小程序弹出框滚动穿透问题
1.在你的遮罩层最外层加 catchtouchmove="noneEnoughPeople" 里面是你的方法名2.noneEnoughPeople: function () { c ...
- spring-cloud-alibaba之Nacos
在微服务构架中,集群服务间的需要调用时就需要知道各个服务的IP和提供服务的端口等信息,如果每个部署一个服务就配置一次,那么必然时非常麻烦的,因此我们需要一个能够统一管理的东西来解决这个问题,由此诞生了 ...
- 代理模式详解:静态代理、JDK动态代理与Cglib动态代理
代理模式简介分类 概念 代理,是为了在不修改目标对象的基础上,增强目标方法的业务逻辑. 客户类需要执行的是目标对象的目标方法,但是真正执行的是代理对象的代理方法,客户类对目标对象的访问是通过代 ...
- STM32F103VET6-keil工程配置-USART串口中断
1.新建一个标准空白工程 2.设置时钟源为外部HSE时钟 1 #ifndef __SYSCLK_CONFIG_H 2 #define __SYSCLK_CONFIG_H 3 #include &quo ...
- Windows系统和Linux系统下安装Mongodb及可视化页面展示
一.Windows系统安装MongoDB 下载地址: 官方:http://www.mongodb.org/ 其它:http://dl.mongodb.org/dl/win32/x86_64 下 ...
- vue 仿zTree折叠树
需求: vue实现仿zTree折叠树,此文章仅作为记录文档. 实现: <template> <div class="line-tree"> <div ...
- 《C++反汇编与逆向分析技术揭秘》--认识启动函数,找到用户入口
<C++反汇编与逆向分析>和<程序员的自我修养>都是以VC6的代码作为例子讲解的.这里是在vs2017下,CRT代码有些区别,但整体流程上都是初始化环境,设置参数,最后转到用户 ...