SpringBoot-狂神(16. SpringSecurity)学习笔记

上一篇 :15. 整合MyBatis

下一篇 :17. Shiro

1. 概述

  • 做项目,系统的安全性是第一位
  • SpringSecurity 和 Shiro ,两者很像,除了一些类、名字不一样
  • 可以做
    • 认证 (你是谁)
    • 授权 (你能干什么)
    • 攻击防护 (防止伪造身份)
  • 权限
    • 功能权限
    • 访问权限
    • 菜单权限
    • ……

2. SpringSecurity 简介

官网 : https://spring.io/projects/spring-security/

SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。

为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

其核心就是一组过滤器链,项目启动后将会自动配置。

最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。
在这里插入图片描述

几个重要的类

  • webSecurityConfiguration : 自定义 security 策略
  • AuthenticationManagerBuilder : 自定义认真策略
  • @EnableWebSecurity : 开启 WebSecurity 模式

3. 使用

1. 配置页面的访问权限

  1. 引入 SpringSecurity 依赖

    <!--SpringSecurity -->
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
  2. 新建一个配置文件,并且继承 WebSecurityConfigurerAdapter

    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            //首页可以所有人访问,但是功能页只能有权限的人能访问
    
    
            http.authorizeRequests()
                    .antMatchers("/").permitAll() // "/"根目录下的资源所有人能访问
                    .antMatchers("/l1/**").hasRole("vip1") // "/l1"下的所有文件只有VIP1级别的用户可以访问
                    .antMatchers("/l2/**").hasRole("vip2")
                    .antMatchers("/l3/**").hasRole("vip3");
    }
    
  3. 测试一下
    访问 /l1 下的文件,报错 403(没有权限)
    在这里插入图片描述

2. 登录

  1. 在刚刚的配置文件中添加上一句
    当没有权限时,跳转到登录页

    //没有权限,跳转到登录页
      http.formLogin();
    
  2. 再测一下
    发送同样的请求,会自动跳转到登录页面
    在这里插入图片描述

  • 但是到现在都没有配置,关于自动跳转登录页的配置,所以为什么会自动跳转?

    点进 formLogin
    在这里插入图片描述
    它上面有很长一段注释,看一下
    在这里插入图片描述
    “进行身份​​验证失败,就会发出 / login 请求,重定向到 / login?error”

    更多跟详细的写法:
    在这里插入图片描述

  1. 定制认证的规则
    还在刚刚的 SecurityConfig 配置文件中重写一个方法

     @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 从内存中读取认证的角色及身份
        // 也可以配置从数据库读取
        // 如果多个可以用 .and() 去拼接
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("hehe").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3");
    }
    

    注意
    在 springboot 2.1.X 中可以直接使用
    在更高版本中,可能会报 PasswordEncoding 的错
    在 SpringSecurity 5.0+ 中增加了很多的加密方法
    使用 passwordEncoder(new BCryptPasswordEncoder()) 进行密码编码

  2. 测试
    登录 hehe 用户
    在这里插入图片描述
    访问 l1 目录下的页面
    在这里插入图片描述
    成功访问
    在这里插入图片描述
    访问其他等级的页面
    在这里插入图片描述
    无访问权限
    在这里插入图片描述

3. 注销

  1. http.formLogin(); 的后面加上一句

    //注销
       http.logout();
    // 注销后跳转到指定页面
       http.logout().logoutSuccessUrl("/");
    
  2. 点进 logout
    在这里插入图片描述
    "会发送 /logout 请求,然后重定向到 /login?success “
    可用的配置
    在这里插入图片描述

  3. 测试
    在这里插入图片描述
    在这里插入图片描述

4. 根据是否登录,显示不同内容

注意
SpringSecurity 4 和 5 整合的包名有些区别
两个版本在页面中的命名空间路径也有区别
两个版本在使用时也同样有区别
需要注意自己的版本与springboot 的版本是否匹配,不匹配不生效

  1. 导入 thymeleaf - SpringSecurity 整合包的依赖

    <!--thymeleaf - SpringSecurity 整合包-->
            <!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity5 -->
            <dependency>
                <groupId>org.thymeleaf.extras</groupId>
                <artifactId>thymeleaf-extras-springsecurity5</artifactId>
            </dependency>
    
  2. 在页面导入 thymeleaf - SpringSecurity 整合包的命名空间

    <html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
    
  3. 修改首页
    需求:
    如果未登录,只显示登录按钮
    如果已登录,显示 用户名、角色、注销按钮

    <!--如果未登录,则显示登录按钮-->
    <li sec:authorize="!isAuthenticated()">
        <a th:href="@{/tologin}">登录</a>
    </li>
    <!--如果已登录,显示用户名 + 注销-->
    <li sec:authorize="isAuthenticated()">
        <span>用户名:<span sec:authentication="name"></span></span>
        <span>角色:<span sec:authentication="principal.authorities"></span></span>
        <span><a th:href="@{/logout}">注销</a></span>
    </li>
    

    在这里插入图片描述

  4. 测试
    未登录
    在这里插入图片描述
    登录
    在这里插入图片描述

5. 根据不同角色,显示不同内容

  1. 修改页面
    在这里插入图片描述
  2. 测试
    未登录
    在这里插入图片描述
    登录只有 VIP1 权限的用户
    在这里插入图片描述
    登录有所有权限的用户
    在这里插入图片描述

6. 实现登录界面”记住我“功能

  1. 在 SecurityConfig 中加入

    //开启记住我功能
    http.rememberMe();
    

    在这里插入图片描述

  2. 测试

    已经多了这样一个单选框
    在这里插入图片描述
    登录,然后关闭浏览器
    再打开浏览器,进入该页面
    在这里插入图片描述
    该用户还在

  3. 实现原理
    把该用户信息存入浏览器的 Cookie
    在这里插入图片描述
    默认保存两周(14天)

7. 设置登录页面

  • 方式一
  1. 进入 http.formLogin(); 看源码
    在这里插入图片描述
    上面的注释中,有这样一个配置项

  2. 修改 http.formLogin();

     http.formLogin().loginPage("/tologin");
    

    /tologin :是去 登录页面 的请求在这里插入图片描述

  3. 查看登录页面,提交表单的请求
    在这里插入图片描述

  4. 测试
    点击自己写的登录按钮,输入存在内存中的用户信息,登录成功
    在这里插入图片描述

  5. 输入框的 name 属性
    在这里插入图片描述
    这里默认是必须要写成 “username” 和 “password” 不然 识别不到

    如果想要修改怎么办呢?
    也有对应的方法
    在这里插入图片描述

    http.formLogin().usernameParameter("name").passwordParameter("pwd");
    

8. 配置自己的”记住我“

  1. 在页面上加入一个 ”记住我“
    在这里插入图片描述
  2. 修改配置文件
    在这里插入图片描述
    这里 rememberMeParameter 的值和页面中 name 的值要一致
  3. 测试,浏览器被加入了 cookie,成功
  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答1: 很抱歉,我是AI语言模型,无法回答关于“狂神springsecurity笔记”的问题。但我可以告诉你,Spring Security是一个基于Spring框架的安全框架,用于保护Web应用程序。它提供了身份验证、授权、攻击防护等功能,可以帮助开发人员构建安全可靠的Web应用程序。狂神是一位知名的Java技术博主,他在自己的博客和视频中分享了很多关于Spring Security的知识和经验。如果你想学习Spring Security,可以参考他的笔记和教程。 ### 回答2: Spring Security 是一个强大的开源安全框架,用于保护 Spring 应用程序。它提供了一系列的安全服务,例如身份验证(Authentication)、授权(Authorization)、密码加密、会话管理等。 狂神在他的 Spring Security 笔记中详细介绍了该框架的使用方式和相关概念。首先,他解释了身份验证的重要性,提及了不同的身份验证方法,如基于表单的认证、基于记住我(Remember Me)的认证以及基于 HTTP Basic 和 Digest 验证等。他还介绍了如何自定义认证过程和处理认证失败的方法。 其次,狂神介绍了授权的概念和不同的授权方式。他解释了基于角色(Role)的访问控制和基于资源(Resource)的访问控制,并示范了如何在 Spring Security 中实现这些授权方式。他还介绍了如何使用注解和表达式来简化授权配置。 此外,狂神还介绍了 Spring Security 提供的其他功能,如密码加密、会话管理、防止跨站点请求伪造(CSRF)攻击等。他指导读者如何使用这些功能来增强应用程序的安全性。 总的来狂神Spring Security 笔记对于初学者来是一个很好的入门指南。他提供了丰富的示例代码和详细解释,让读者可以很容易地理解和使用 Spring Security。无论是开发 Web 应用程序还是企业级应用程序,掌握 Spring Security 都是非常重要的,狂神笔记提供了一个很好的起点。 ### 回答3: spring security 是一个开源的安全框架,可以为应用程序提供身份验证和授权管理的功能。它基于 JavaEE 标准认证和授权机制,并提供了一套更灵活的安全性管理机制。 首先,Spring Security 实现了用户认证的功能,可以通过多种认证方式来验证用户的身份,包括基于数据库的认证、LDAP 认证、OAuth2 认证等。可以根据具体的需求选择使用不同的认证方式。 其次,Spring Security 提供了授权管理的功能,可以设置不同的权限角色,对不同的用户进行授权。可以通过配置的方式进行权限的控制,通过注解或者编程的方式进行细粒度的控制,可以灵活地满足不同的应用需求。 另外,Spring Security 还提供了许多其他的安全支持功能,如防止 CSRF 攻击、防止点击劫持、防止 SQL 注入等。它还支持与其他框架的集成,如与 Spring Boot、Spring MVC 的集成,可以方便地在现有的应用中集成安全功能。 Spring Security 的架构清晰,易于理解和使用。它的设计模式和扩展机制可以满足不同级别的定制需求,使得我们可以根据实际情况来灵活地进行使用和扩展。同时,Spring Security 还提供了丰富的文档和示例代码,方便开发者学习和使用。 总之,Spring Security 是一个功能强大且灵活的安全框架,可以在应用程序中实现身份验证和授权管理的功能。通过使用 Spring Security,我们可以有效地保护和管理我们的应用程序,提升系统的安全性。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuan_404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值