竹笋

首页 » 问答 » 环境 » springbootspringsec
TUhjnbcbe - 2023/8/20 21:10:00
白癜风用什么药最管用 http://m.39.net/pf/a_4440900.html
白癜风用什么药最管用 http://m.39.net/pf/a_4440900.html

1、前言部分

1.1、如何学习?

看springsecurtiy原理图的时候以为洒洒水,结果自己动手做的时候一窍不通,所以一定不要眼高手低,实践出真知!通过各种方式学习springsecurity,在B站、腾讯课堂、网易课堂、慕课网没有springsecurity的前后端分离的教学视频,那我就去csdn去寻找springsecurity博客,发现几个问题:

要么就是前后端不分离,要么就是通过内存方式读取数据,而不是通过数据库的方式读取数据,要么就是大佬们给的代码不全、把代码讲的太绕,关键部分没有注释。讲的例子不那么通俗易懂,不利于新手的学习。代码本身有bug,或者就没有我想要实现的效果。实在不行我又跑去github上找开源项目学习,github由于是外国网站,国内访问速度有点慢!!那就用国内的gitee吧,gitee上的开源项目都是结合实战项目的,代码逻辑也比较复杂,我对项目的业务逻辑没什么了解,感觉不适合我。我这一次选择比较反人性的方式去学习,就是手撕源码和看官方文档。老实讲,刚开始看源码和官方文档特别难受,并且看不进去,那些springsecurity的类还有接口名字又臭又长,这时我就下载源码,源码的注释多的就像一本书,非常详细且权威。

当然别指望看几遍就能看懂,我看这些注释、源码、博客看了10几遍甚至20几遍才看懂,每次去看都有不同的收获!!!

此文章截图水平不高、理解为主、欣赏为辅!!内容有点多,每一步都有详细解析,请耐心看完,看不懂可以多看几遍。。

1.2、技术支持

jdk1.8、springboot2.3.4、mybatis-plus3.4.1、mysql5.5、springsecurity5.3.4、springmvc、lombok简化entity代码,不用你去写get、set方法,全部自动生成、gson2.8.2将json对象转化成json字符串

1.3、预期实现效果图

未登录时访问指定资源,返回未登录的json字符串,index是我在controller层写的一个简单接口,返回index字符串

输入账号错误,返回用户名错误的json字符串,需说明一点,/login是springsecurity封装好的接口,无须你在controller写login接口,/logout也同理。

输入密码错误,返回密码错误的json字符串

登录成功,返回登录成功的json字符串并返回cookie

登录成功并且拥有权限访问指定资源,返回资源相关数据的json字符串

登录成功但无权限访问指定资源时,返回权限不足的json字符串

异地登录,返回异地登录,强制下线的json字符串,测试的基础是要在两台不同的机器上登录,然后访问/index。

注销成功,返回注销成功的json字符串并删除cookie

2、核心部分

2.1、springsecurity原理解释:

springsecurity最重要的两个部分:authentication(认证)和authorization(授权)

认证:就是判定你是什么身份,管理员还是普通人

授权:什么样的身份拥有什么样的权利。

简单理解:自定义配置登录成功、登陆失败、注销成功目标结果类,并将其注入到springsecurity的配置文件中。如何认证、授权交给AuthenticationManager去作

复杂理解:

(1)用户发起表单登录请求后,首先进入

UsernamePasswordAuthenticationFilter

,在UsernamePasswordAuthenticationFilter中根据用户输入的用户名、密码构建了

UsernamePasswordAuthenticationToken

,并将其交给AuthenticationManager来进行认证处理。

AuthenticationManager本身不包含认证逻辑,其核心是用来管理所有的

AuthenticationProvider

,通过交由合适的AuthenticationProvider来实现认证。

(2)下面跳转到了

SelfAuthenticationProvider

,该类是AuthenticationProvider的实现类:你可以在该类的

Authenticationauthenticate(Authenticationauthentication)

自定义认证逻辑,然后在该类中通过调用

UserDetailsloadUserByUsername(account)

去获取数据库用户信息并验证,然后创建

并将权限、用户个人信息注入到其中,并通过

setAuthenticated(true)

设置为需要验证。

(3)至此认证信息就被传递回UsernamePasswordAuthenticationFilter中,在UsernamePasswordAuthenticationFilter的父类

AbstractAuthenticationProcessingFilter

doFilter()

中,会根据认证的成功或者失败调用相应的handler:所谓的handler就是我们注入到springsecurity配置文件的handler。

2.2、踩坑集锦

访问/login时必须要用post方法!,访问的参数名必须为username和password访问/logout时即可用post也可用get方法!//springsecurity配置文件中的hasRole()不能以ROLE开头,比如ROLE_USER就是错的,springsecurity会默认帮我们加上,但数据库的权限字段必须是ROLE_开头,否则读取不到.antMatchers(/index).hasRole(USER).antMatchers(/hello).hasRole(ADMIN)

2.3、代码部分

pom依赖文件

dependencies!--转换成json字符串的工具--dependencygroupId

1
查看完整版本: springbootspringsec