本章是记录如何创建一个springsecurity工程的重要过程,菜鸟记录工程流程以便学习总结!
关于springsecurity的本质:过滤器链
springboot通过过滤器链实现登录的认证,用户授权
1.springSecurity的原理:
1)springsecurity存在一个类----Filterchainproxy ,(proxy译为代理)
2)Filterchainproxy内置了15个过滤器
现介绍其中几个核心的过滤器
(1)SecurityContexPersistenceFilter
作用:初始化securityContext,该上下文用于存储用户信息,用于所有过滤器共享
(2)CsrfFilter
拦截范围:post请求
csrf:跨站点攻击流程:首先用户访问A界面 ,并将用户名密码等信息存储到cookie中,在 未关闭A界面的情况下,访问B界面,B界面通过<script src="A"> 的手段,成功通过cookie访问A网站 并执行恶意代码
解决csrf的方法:1:验证referer :指验证前一个界面的地址和设定的地址是否相同
2:csrftoken:例如:用户在点击转账时,跳转到转账页面,那么转账页面 会给你一个token,那么在你确认转账时,会验证token是不是正确
(3)logoutFilter:
拦截范围:请求方式:post , 请求地址:/logout
作用:销毁securityContext内容
(4)UsernamepasswordAuthenticationFilter
拦截地址:/login 拦截请求:post
作用:验证username password是否正确 ,并将用户信息提交到securitycontext中
(5)DefaultloginPageGeneratingFilter
拦截方式:get
作用:产生默认登录页面
(6)ExceptionTanslationFilter
作用:处理异常
(7)FilterSecurityIntercepter
也是一个过滤器 ,并且是过滤器链的最后一个,用于确认是否登录以及实现登陆成功的页面 跳转,登陆失败返回登陆界面
构建springsecurity工程
一:工程初始化步骤
1.第一步:pom依赖
2.第二步 在resources目录下创建application.yml文件
3.第三步 创建启动类
注意点 :1)加上@springbootApplication注解 ,
2)用内置对象 springApplication调用run方法
启动后 访问login登陆页面 默认用户名为user 密码在IDEA控制台上
二.具体工程功能实现
1.自定义登陆界面
注意点:(1)输入标签的name只能做name和password,如果要更改需要在security文件中更改
2.创建springsecurity配置类
步骤:1)创建配置类,在类名上加上注释:@Configuration@EnableWebSecurity
2)重写3个configuration方法
3)把三个配置类,主要是http配置进行设置,放行自定义登陆界面
3.自定义登出界面
在重写http方法页面写下如下代码,那么dengchu代表退出登录
//指定登出界面 http.logout().logoutUrl("/dengchu");
4.自定义数据库认证流程
1)用户输入的信息在通过过滤器后,会将name和password封装 ,传输给AuthenticationManager,
2)随后它会根据登录的方式(密码登录,短信登录等)找到对应的provider,
3)然后再调用其中的getUserDetailsService接口中的loadUserbyname,从数据库中查找user
4)将数据库中的user与登录用户比较,确认成功后将user信息返回到Securitycontext
4.1实现数据库依赖
导入mybatis-spring-boot-starter,mysql-connector , druid
4.2 配置类 application.yml
4.3
创建Sysuser实体类
4.4
创建mapper文件:注意@Mapper注释,@Select
4.5创建Service文件
注意点:1.添加@Component注解
2.实现UserDetailService接口
3.service逻辑 :按照用户姓名查找出一个user,不用密码的原因是因为password在数据库 中是密文存储,无法进行比较
4.6
在security配置类中自动装配service,然后再授权项授权Service,并且指定数据库的加密方式
设置为Bcrypt加密,这种加密方式和时间有关,分为三段,难以破解
5.创建index界面,并获取用户名字
通常通过SecurityContextHolder.getContext.getAuthentication().getPrincipal();
6.创建index界面,将展示框根据角色的权限展示
,并在界面的上方导入thymeleaf,security的地址
7.设置student,course 的controller
8.设置学生管理 学生添加界面,并在index界面中设置点击事件,展现对应页面
9.对于index界面中的跳转,应该在security的http设置中将其释放,以便展示学生,课程界面
10.进行权限限制之后,角色仍能够根据url访问相应的页面 ,所以权限并没有完全确定,此时应该在security的配置类上面设置@EnableGlobleMethodSecurity ,并打开设置prepostEnable=true,打开认证,并在controller下的方法设置访问角色的控制
11.设置全局异常处理,即处理方法粗粒度权限控制
当发生访问页面,但权限不被允许的情况下时,就会产生403错误信息,此时我们可以自定义相关异常处理
即,创建全局异常处理类,并打上@ControllerAdvice 在对应方法下标注处理什么样的异常,即加上@ExceptionHandler
12.通过粗粒度控制人员访问信息:粗粒度是在controller方法中用@PreAuthorize("hasAnyauthorize"),通过权限授权,但是这样的话就得查找到登录用户的权限
13.通过细粒度控制权限信息
1)首先导入糊涂工具包
2)创建mapper 通过userId 查找到该用户的权限信息,这里涉及到数据库操作的连表查询
数据库连表查询技巧:疯狂的连接中间表,然后在最后的一步连接主体表,然后再输入主体表查询条件
3)将通过sql查询到的authorities进行封装,通过糊涂工具包的api,strUtil.join,将authorities和rolelsit封装成两个string,再将她俩连接起来。然后在调用AuthorityUtiils.caommaSeparatedStringToAuthorityList。这个方法的作用是服务器能够解析两个字符串,究竟谁是role,谁是authority,
4)创建Sysuser实体类
serviceUserDetail接口最终就是最终就是在数据库中查找到对应的user,所以它只提供查找功能,
总体来说一个springsecurity的工程就是这样子了,有很多不懂的地方,还需要以后去改正,第一个博客,我是菜鸟 波仔
----------------------2022/7/5