SpringSecurity工程

本章是记录如何创建一个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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值