IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 想要粽子可以,但是得经过我的认证授权才可以 -> 正文阅读

[Java知识库]想要粽子可以,但是得经过我的认证授权才可以

🏇 s p r i n g b o o t 中 如 何 加 入 安 全 \textcolor{Orange}{springboot中如何加入安全} springboot
🙏 学 习 过 程 中 的 笔 记 , 方 便 查 阅 学 习 \textcolor{green}{学习过程中的笔记,方便查阅学习} 便💗
🍣 笔 记 总 结 来 源 于 视 频 B 站 狂 神 说 \textcolor{green}{笔记总结来源于视频B站狂神说} B🍣
欢迎各位小伙伴😄关注👍点赞??收藏📝留言

安全是非功能性需求。

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

做网站:安全应该在设计开始的时候就考虑。

shiro,SpringSecurity:除了类和名字不一样,其他都一样。主要功能就是认证和授权。

用于:功能权限,访问权限,菜单权限

实际操作

  1. 创建项目并将web模块和Thymeleaf模块引入

    在这里插入图片描述

  2. 将静态文件导入

    在这里插入图片描述

  3. 将模板引擎的缓存关掉,方便调试

    spring.thymeleaf.cache=false
    
  4. 配置controller

    package com.hxl.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class RouterController {
    
        @RequestMapping({"/","/index"})
        public String index(){
            return "index";
        }
    
        @RequestMapping("/toLogin")
        public String toLogin(){
            return "views/login";
        }
    
        @RequestMapping("/level1/{id}")
        public String level1(@PathVariable("id") int id){
            return "views/level1/" + id;
        }
        @RequestMapping("/level2/{id}")
        public String level2(@PathVariable("id") int id){
            return "views/level2/" + id;
        }
        @RequestMapping("/level3/{id}")
        public String level3(@PathVariable("id") int id){
            return "views/level3/" + id;
        }
    }
    
  5. 启动测试localhost:8080成功运行即可

Spring Security

Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入 spring-boot-starter-security 模块,进行少量的配置,即可实现强大的安全管理!

记住几个类:

  • WebSecurityConfigurerAdapter:自定义Security策略
  • AuthenticationManagerBuilder:自定义认证策略
  • @EnableWebSecurity:开启WebSecurity模式

Spring Security的两个主要目标是 “认证” 和 “授权”(访问控制)。

“认证”(Authentication)

身份验证是关于验证您的凭据,如用户名/用户ID和密码,以验证您的身份。

身份验证通常通过用户名和密码完成,有时与身份验证因素结合使用。

“授权” (Authorization)

授权发生在系统成功验证您的身份后,最终会授予您访问资源(如信息,文件,数据库,资金,位置,几乎任何内容)的完全权限。

这个概念是通用的,而不是只在Spring Security 中存在。

认证授权

  1. 引入Spring Security模块

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
  2. 编写config

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

  3. 编写基础配置类

    package com.hxl.config;
    
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @EnableWebSecurity //开启WebSecurity模式
    public class Security extends WebSecurityConfigurerAdapter {
        //链式编程
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            super.configure(http);
        }
    }
    
  4. 定制授权

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人可以访问,功能页只有对应有权限的人才能访问
        /*http.authorizeRequests()这是认证请求,后面的.就是说明可以访问的*/
        http.authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/level1/**").hasRole("vip1")
            .antMatchers("/level2/**").hasRole("vip2")
            .antMatchers("/level3/**").hasRole("vip3");
    }
    
  5. 测试

    此时发现,除了首页之外,其他的都进不去,这是因为没有登录角色的权限

  6. 开启登录配置

    在上面的定制授权方法里面,加入下面代码

    //没有权限默认跳转到登录页面,需要开启登录的页面
    http.formLogin();
    
  7. 测试

    如果没有权限,会自动跳转到登录页面,并且跳转链接为http://localhost:8080/login

  8. 认证

    //认证,可以在内存中认证,也可以在数据库中认证
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("hxl").password("{noop}123456").roles("vip1","vip2")
            .and()
            .withUser("root").password("{noop}123456").roles("vip1","vip2","vip3")
            .and()
            .withUser("wode").password("{noop}123456").roles("vip1");
    }
    
  9. 注意看上面

    发现在密码那一栏中增加了一个{noop}这是因为如果不添加这个就会报下面这个问题
    在这里插入图片描述

    这是由于加密的原因,前端传过来的密码要进行某种方式的加密,当然除了上述的方法之外还可以用下面的方式进行加密。

    auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
              .withUser("hxl").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2");
    

    这种方式也是可以的。官方推荐的是使用bcrypt加密方式

  10. 测试

    这样之后发现每个用户只能访问自己认证下的规则。不能访问其他的,否则会报错

    在这里插入图片描述

权限控制和注销

  1. 首先开启配置的注销功能

    加上后面的logoutSuccessUrl就是注销成功后,依旧可以跳转到首页

    //链式编程
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            //....
            //注销,开启注销功能,跳到首页
            http.logout().logoutSuccessUrl("/");
        }
    
  2. 增加一个注销按钮

    <!--注销-->
    <a class="item" th:href="@{/logout}">
        <i class="sign-out icon"></i> 注销
    </a>
    
  3. 测试

    在这里插入图片描述

    在这里插入图片描述

    点击即可注销,并且可以返回首页。

  4. 功能优化

    登录成功后,导航栏显示用户信息以及注销按钮。没有登录则只显示登录按钮。同时首页显示只显示用户拥有权限的页面。

  5. 登录注销以及用户信息

    • 下载依赖

      <!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity5 -->
      <dependency>
          <groupId>org.thymeleaf.extras</groupId>
          <artifactId>thymeleaf-extras-springsecurity5</artifactId>
          <version>3.0.4.RELEASE</version>
      </dependency>
      
    • index.html

      加上命名空间

      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
      

      如果在编写下面的sec的时候没有提示,则修改命名空间为

      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
      

      修改登录注销功能及导航栏

      <!--登录注销-->
      <div class="right menu">
          <!--未登录-->
          <div sec:authorize="!isAuthenticated()">
              <a class="item" th:href="@{/toLogin}">
                  <i class="address card icon"></i> 登录
              </a>
          </div>
          <!--已登录-->
          <div sec:authorize="isAuthenticated()">
              <a class="item">
                  <i class="address card icon"></i>
                  用户名:<span sec:authentication="principal.username"></span>
                  角色:<span sec:authentication="principal.authorities"></span>
              </a>
          </div>
          <!--注销-->
          <div sec:authorize="isAuthenticated()">
              <a class="item" th:href="@{/logout}">
                  <i class="address card icon"></i> 注销
              </a>
          </div>
      </div>
      
  6. 角色功能认证

    以一个为例,其他的将其加上即可。

    在这里插入图片描述

    <div class="column" sec:authorize="hasRole('vip1')">
    
  7. 测试

    在这里插入图片描述

  8. 注意登录的时候我们必须去http://localhost:8080/login这个页面,而不是我们最开始的http://localhost:8080/toLogin。接下来就解决这个问题。

记住我

@Override
protected void configure(HttpSecurity http) throws Exception {
    //首页所有人可以访问,功能页只有对应有权限的人才能访问
    /*http.authorizeRequests()这是认证请求,后面的.就是说明可以访问的*/
    http.authorizeRequests()
        .antMatchers("/").permitAll()
        .antMatchers("/level1/**").hasRole("vip1")
        .antMatchers("/level2/**").hasRole("vip2")
        .antMatchers("/level3/**").hasRole("vip3");
    //没有权限默认跳转到登录页面,需要开启登录的页面
    http.formLogin();

    //注销,开启注销功能,跳到首页
    http.logout().logoutSuccessUrl("/");

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

在这里插入图片描述

这个是默认的登录,如果需要在自己的登录页面进行登录还需要操作

怎么完成的呢?

我们关闭浏览器后,再次登录,可以发现用户还是存在的。那么如何实现呢?我们查看一下浏览器的cookie,发现了他,并且默认保存时间是两周。

在这里插入图片描述

登录成功后,将cookie发送给浏览器保存,以后登录带上这个cookie,只要通过检查就可以免登录了。而一旦手动删除后cookie后,那么就不会存在了。

一个完整的首页

只需要在后面增加这一个代码即可。但是要注意和前端的要保持一致。

//没有权限默认跳转到登录页面,需要开启登录的页面
//定制登录页
http.formLogin().loginPage("/toLogin");

在这里插入图片描述

如果前端是login那么后端就需要变成

//定制登录页
http.formLogin().loginPage("/toLogin").loginProcessingUrl("/login");

同时如果表单的信息如果和默认信息不一致那么就需要进行修改

http.formLogin().usernameParameter("username").passwordParameter("password").loginPage("/toLogin").loginProcessingUrl("/login");

至此就结束了。

  • 增加记住我的功能

    <div class="field">
        <input type="checkbox" name="remember"> 记住我
    </div>
    
  • 后端需要进行验证

    //开启记住我的功能,定制记住我接收前端的参数
    http.rememberMe().rememberMeParameter("remember");
    

测试

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:21:09  更:2022-06-14 22:25:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:19:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码