登录/注册
唐某
11055
占位
7
占位
31
浏览量
占位
粉丝
占位
关注
Spring Security极简入门三部曲(上篇) - 白泽来了
唐某
2021-05-07 17:53:38 2021-05-07
119
0

目录

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将围绕用户表<->角色表展开(且将先不使用数据库),数据库的使用,以及角色表<->权限表部分将在后续博客讲解

实现功能:

  1. 网站分为首页、登陆页、用户页、管理员页、报错页
  2. 使用用户名密码登陆,登陆失败报错
  3. 首页、登陆页所有角色都能访问
  4. 用户页需要USER或ADMIN权限,管理员页需要ADMIN权限(权限不足时跳转至403页面)
  5. 如果用户没有登录,则访问需要权限的页面时自动跳转登录页面,登陆成功后自动跳转至访问的页面
  6. 别愣着了,快把项目克隆到本地并尝试运行呀!最好再自己新建一个项目跟着写一遍~

测试结果:

  1. github项目地址,点击主页跳转至登陆页面,输入定义好的用户名和密码
  2. 如果用户名或密码出错则在登陆页显示错误
  3. 如果登陆成功则跳转至/user(无论是用admin还是user登陆都是默认跳转至/user)
  4. 如果在登陆状态下用户为user,此时点击管理员页的连接会跳转至403(权限不足),而点击用户页则可以正常访问
  5. 如果登陆状态下用户为admin,此时点击管理员页和用户页都可以正常访问
  6. 点击退出登陆则清除登陆账户session记录,跳转至/login登陆页
  7. 如果一开始在未登录时点击用户页或管理员页,则会先跳转至登陆页提示登陆,输入信息后会自动跳回之前请求的用户页或者管理员页,但是,如果起初点击的是管理员页,而在提示输入登陆信息时输入了user的登陆信息,则在最终访问管理员页面时会出现403提示(因为user账户没有admin权限)

核心代码讲解

事实上,需要你编写的Spring Security相关代码其实只涉及到一个类中的不到二十行代码~,如果你只想知道怎么用,完全可以只看那个SecurityConfiguration配置类的代码

这个自定义的配置类继承了Spring Security提供的一个父类WebSecurityConfigurerAdapter,并重写了它的两个configure方法,第一个方法在程序运行时于内存中创建两个用户(用户名&密码)并赋予角色,我们前端的登陆就是去匹配这两个定义好的用户

user用户,密码为123(加密处理),赋予USER权限(角色)

admin用户,密码为123(加密处理),赋予USER和ADMI

暂无评论