springboot security学习-01

2023-11-14

引入相关依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

一、三种配置方式:

1、配置文件设置.properties

#账号密码角色设置
spring.security.user.name=root
spring.security.user.password=root
spring.security.user.roles=ROLE_ADMIN

2、配置类设置

重写WebSecurityConfigurerAdapter中的configure方法

@Configuration
public class MySecurity extends WebSecurityConfigurerAdapter {
         @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {             
            auth.inMemoryAuthentication()
            .withUser("yxj")
            .password(passwordEncoder()
            .encode("yxj"))
            .roles("ADMIN");
        }

        @Bean
        PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
}

3、自定义实现类(数据库认证)

引入依赖

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

一、创建配置类

@Configuration
public class MySecurity extends WebSecurityConfigurerAdapter {
        @Autowired
        private UserDetailsService userDetailsService;
        
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {             
            auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder())
        }

        @Bean
        PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
}

二、编写实现类

UserDetailsServiceImpl

package com.xmut.uservice;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xmut.dao.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("userDetailsService")  //userDetailsService要跟自动注入的名字一样
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        //查询数据库
        QueryWrapper<com.xmut.domain.User> wrapper = new QueryWrapper();
        wrapper.eq("username",s);
        com.xmut.domain.User user = userMapper.selectOne(wrapper);
        //判断账号是否存在
        if(user == null){
            throw new UsernameNotFoundException("用户名不存在");
        }else {
            System.out.println("登录成功");
            List<GrantedAuthority> author = AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_role");
            return new User(user.getUsername(),new BCryptPasswordEncoder().encode(user.getPassword()),author);
        }

    }
}
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `username` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',
  `password` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
  `role` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'admin', 'admin', 'admin');
INSERT INTO `user` VALUES (2, 'kongjun', '123', 'user');

SET FOREIGN_KEY_CHECKS = 1;

application.properties

spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/bookdb?serverTimezone=UTC&useSSL=false
spring.datasource.username = root
spring.datasource.password = 123456

 User

@Data
public class User {
    private Integer id;
    private String username;
    private String password;
}

 UserMapper

package com.xmut.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xmut.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}

二、权限设置和csrf防护(configure(HttpSecurity http))

1、页面权限
 @Override
    protected void configure(HttpSecurity http) throws Exception {
        //1、未授权跳转页面
        http.exceptionHandling().accessDeniedPage("/unauth.html");
        //2、自定义登录页面+权限角色认证
        http.formLogin()
                .loginPage("/login.html") //跳转页面
                .usernameParameter("username") //登录页面用户名输入框的name属性
                .passwordParameter("password") //登录页面密码输入框的name属性
                .failureUrl("/error.html") //登录失败跳转页面)
                .loginProcessingUrl("/user/login")  //登录访问路径(跟from中的地址要一致)
                .defaultSuccessUrl("/hello.html").permitAll()    //认证成功后跳转的路径
                .and()
                .authorizeRequests()    //前两个是权限,后两个是角色,角色比权限更高
                .antMatchers("/","/test/hello","/logout").permitAll()   //设置那些路径可以直接访问不需要认证
                .antMatchers("/test/index").hasAuthority("admin,user")   //访问当前路径需要拥有admin权限和user权限
                .antMatchers("/test2").hasAnyAuthority("admin","user")   //访问当前路径需要拥有admin或者user权限)
                .antMatchers("/test/index3").hasRole("role2")   //访问当前路径需要拥有role角色
                .antMatchers("/test4").hasAnyRole("role","role2")   //访问当前路径需要拥有role或者role2角色
                .anyRequest().authenticated()   //所有请求都能访问
                .and()
                    .rememberMe().tokenRepository(persistentTokenRepository())
                    .tokenValiditySeconds(60)  //token有效期为60s
                    .userDetailsService(userDetailsService)
                .and().csrf().disable();    //关闭csrf防护

    }
2、注销功能
   <!--前端页面-->
 <a href="/logout">退出</a>
        //注销,退出登录后跳转到index.html
        http.logout().logoutUrl("/logout").logoutSuccessUrl("/login.html").permitAll();
3、自动登录功能
   <!--from表单中添加-->
 <input type="checkbox" name="remember-me"/>自动登录
 //1、注入数据源
    @Autowired
    private DataSource dataSource;
 //2、配置对象
    @Bean
    public PersistentTokenRepository persistentTokenRepository() {
        JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
        tokenRepository.setDataSource(dataSource);
//        tokenRepository.setCreateTableOnStartup(true);  //自动创建表结构创建一次就要取消
        return tokenRepository;
    }

//在csrf防护前面添加以下代码
.and()
   .rememberMe().tokenRepository(persistentTokenRepository())
   .tokenValiditySeconds(60)  //token有效期为60s
   .userDetailsService(userDetailsService)
3、配置csrf防护

from表单中添加以下代码

<!--    开启csrf防护,防止跨站攻击,隐藏表单-->
<!--    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}">-->

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot security学习-01 的相关文章

  • 如何获取枚举的子集

    大多数情况下 包含所有元素的枚举显示在用户界面的下拉列表中 我们只需要在用户界面中显示 5 个字段中的 2 个 通过某种方式利用可用于枚举的相同函数来获取此数据的更简单方法是什么 enum Color RED GREEN BLACK BLU
  • 带有来自 Selenium 2 / WebDriver 的 Id 的 jQuery 元素选择器

    我可以在 Selenium 中获取元素的 ID RemoteWebElement webElement getId 它返回一个像这样的字符串 e9b6a1cc bb6f 4740 b9cb b83c1569d96d 我想知道这个ID的来源
  • 哪个类调用了我的静态方法?

    假设我有一个带有静态方法的 Java 类 如下所示 class A static void foo Which class invoked me 进一步假设 A 类有任意数量的子类 class B extends A class C ext
  • 不同的 JDK 更新会产生不同的 Java 字节码吗?

    假设场景 我有一个项目 其源合规性级别指定为 1 5 现在 我使用两种不同的 JDK 编译此项目 首先使用 JDK 6 Update 7 然后使用 JDK 6 Update 20 这两个不同的 JDK 是否会生成不同的 Java 字节代码
  • 使用 xuggle 将 mp3 转换为 wav 出现异常

    我正在尝试将 mp3 转换为 wav 代码在这里 String mp3 F work pic2talk38512 mp3 String wav F work pic2talk38512 wav TranscodeAudioAndVideo
  • JPA:如何将字符串持久保存到数据库字段中,输入 MYSQL Text

    需求是用户可以写文章 所以我选择typeText为了contentmysql数据库内的字段 我怎样才能转换Java String into MySQL Text 干得好Jim Tough Entity public class Articl
  • 适用于 Solaris 的 Java 8 中缺少 javaws

    看起来 Oracle 从 Java 8 for Solaris 中删除了 Java Web Start javaws 在 Java 8u51 中不再可用 来自兼容性指南 http www oracle com technetwork jav
  • 根据哈希值确认文件内容

    我需要 检查完整性 content文件数量 文件将写入 CD DVD 可能会被复制多次 这个想法是识别正确复制的副本 在从 Nero 等中删除它们之后 我对此很陌生 但快速搜索表明Arrays hashCode byte http down
  • Jodatime 日期格式

    是否可以格式化 JodaTime 日期 这是代码 private static LocalDate priorDay LocalDate date1 do date1 date1 plusDays 1 while date1 getDayO
  • MongoDB:尝试从 JSON 读取 Long 导致 java.lang.Integer 无法转换为 java.lang.Long

    我有一个代码可以从 MongoDB 读取特定格式的数据 我需要测试一下 为此 我使用要测试的数据创建一个 JSON id ObjectId 57552e32e4b0839ede67e0af serial 574000690 startDat
  • JSON 对象数组转 Java POJO

    将此 JSON 对象转换为 java 中的类 您的 POJO 类中的映射将如何 ownerName Robert pets name Kitty name Rex name Jake This kind of question is ver
  • 在java.util中获取错误ArrayList不带参数[重复]

    这个问题在这里已经有答案了 我已经创建了一个类 Student 现在我尝试将我的 Student 对象存储在 ArrayList 中 但在编译 ArrayList 不接受参数时出现错误 我已经检查了我的代码很多次 但找不到问题所在 我的学生
  • 将多个视频文件合并到一个文件中

    我有多个以相同帧速率和分辨率录制的视频 我想将两个视频合并为一个视频 因此结果文件将是大视频 我正在使用 MP4 解析器 api 并使用下面的代码 Movie countVideo new MovieCreator build Channe
  • 给定一个单词列表 - 在 java 中完成单词的好的算法是什么?权衡:速度/效率/内存占用

    我正在探索潜在的免费 付费应用程序的硬件 软件要求 最终目标是移动 Java 应用程序 该应用程序将从这个简单的目标开始 给定数据库中相关单词的列表 能够对单个字符串输入进行单词补全 换句话说 我已经知道数据库的内容 但算法的内存占用 速度
  • wsdl 没有服务元素

    我必须使用 WCF Web 服务并获得 WSDL 外部的 因此无法控制 WSDL 在 WSDL 定义中 我没有找到包含服务 端口和地址元素的服务元素 WSDL 中不存在这种情况正常吗 这对于 WCF WSDL 来说很常见吗 我正在尝试使用轴
  • java 1.8下无法启动eclipse

    java 1 8 升级后我无法启动 eclipse 附上错误截图 这是我的 eclipse 配置设置 我该如何解决 startup plugins org eclipse equinox launcher 1 3 0 v20120522 1
  • Storm Spout 未收到 Ack

    我已经开始使用storm 所以我使用创建简单的拓扑本教程 https github com nathanmarz storm wiki Tutorial 当我运行我的拓扑时LocalCluster一切看起来都很好 我的问题是我没有得到元组的
  • Drools:为什么是无状态会话?

    Drools 使用会话来存储运行时数据 为此 有两种会话 无状态和有状态 与无状态会话相比 有状态会话允许迭代调用 并且似乎比无状态会话具有所有优势 那么为什么会有无状态会话呢 他们服务的目的是什么 与有状态会话相比 它们的优势是什么 谢谢
  • spring data jpa 过滤 @OneToMany 中的子项

    我有一个员工测试实体是父实体并且FunGroup信息子实体 这两个实体都是通过employeeId映射 我需要一种方法来过滤掉与搜索条件匹配的子实体 以便结果仅包含父实体和子实体 满足要求 员工测试类 Entity name Employe
  • 线程“main”中出现异常 java.lang.UnsatisfiedLinkError: ... \jzmq.dll: 找不到依赖库

    我有一个使用 ZMQ 的 java 应用程序 我已经能够在我的 Win7 PC 上运行它 我将 jzmq dll 放在 jar 可执行文件所在的同一文件夹中 然后通过命令 java jar myapp jar 运行它 我的下一步是将其移至服

随机推荐

  • 刷脸支付大量的商户正在大步踏进数字化

    传统的商业零售不缺乏客源 但是弊端在于 顾客和商家建立有效接触的时间太短 可能只有结账时的短短十秒左右 很多人都有过去便利店买东西 店员安利办会员卡的经历 但是绝大多数人只想尽快买单走人 商家想做进一步精准推进和营销实在难上加难 蜻蜓是首款
  • Python3,我把新年祝福写在“雨“中,你看,雨一直下,气氛还算融洽,在同个屋檐下....

    新年愿望写在 雨 中 1 引言 2 代码实战 2 1 模块介绍 2 1 1 Pygame 介绍 2 1 2 Pygame的display介绍 2 1 3 Pygame的event介绍 2 1 4 Pygame的font介绍 2 2 代码示例
  • C++之弱引用智能指针weak_ptr的验证

    目录 shared ptr带来的问题 标准库weak ptr弱引用验证 标准库中weak ptr交叉引用的验证 shared ptr带来的问题 在交叉引用时 会造成堆上资源无法释放的问题 使用weak ptr弱引用就可以打破这个交叉引用 因
  • 如何判断一组数据是否符合正态分布呢?

    在很多模型及假设检验中都需要满足一个假设条件 数据需服从正态分布 这篇文章主要讲讲如何判断数据是否符合正态分布 主要分为两种方法 描述统计方法和统计检验方法 判断一组数据是否为正态分布的方法 描述统计方法 Q Q图 P P图 直方图 茎叶图
  • C程序argc、argv的使用

    前提 C文件编译 汇编后生成的 exe文件 就可以通过命令行来执行该exe文件 命令行执行 exe文件 用微软推出的powershell 格式是 start exe 或者 start exe 用powershell无法输入argv 总是执行
  • Spring boot 序列化规则

    Include Include ALWAYS 默认 Include NON DEFAULT 属性为默认值不序列化 Include NON EMPTY 属性为 空 或者为 NULL 都不序列化 Include NON NULL 属性为NULL
  • Window命令激活(不需要安装软件,激活180天)

    1 以管理员方式运行命令 注解 该命令为设置KMS服务器地址 slmgr skms kms micaesoft com 2 激活 注解 该命令为向KMS服务器发起请求 slmgr ato 其他 激活完毕后 若要查看许可证详细信息 可使用命令
  • 方差与分类分析

    分类数据与方差分析 1 分类数据 2 chi 2 2 统计量 这个统计量主要用于测定两个分类变量之间的相关程度 若用 f 0
  • python增加一列数据_使用Python向DataFrame中指定位置添加一列或多列的方法

    对于这个问题 相信很多人都会很困惑 本篇文章将会给大家介绍一种非常简单的方式向DataFrame中任意指定的位置添加一列 在此之前或许有不少读者已经了解了最普通的添加一列的方式 如下 import pandas as pd feature
  • 多边形区域填充算法_求取任意两个多边形的IOU

    在目标检测中 真值与预测值的交并比IoU Intersection over Union 是用来评价检测模型的一个重要指标 通俗意义上来讲 也就是检测结果与真实的结果重叠的区间所占两者面积之和的权重 一般说来 当IoU gt 0 5 我们认
  • .net 面试题(高级开发人员篇)

    1 DateTime Parse myString 这行代码有什么问题 有问题 当myString不能满足时间格式要求的时候 会引发异常 建议使用DateTime TryParse 2 PDB是什么东西 在调试中它应该放在哪里 PDB是用于
  • python opencv打开摄像头失败报错,尝试使用网络摄像头python opencv捕获视频时gstreamer严重错误...

    i m trying to take a video with webcam using opencv and python with a simple code import numpy as np import cv2 cap cv2
  • C++字符串常量跨平台编译问题

    C 字符串常量跨平台编译问题 与字符串编码相关 有需要的朋友可以参考下 问题 在C 代码中 给一个string类型的变量赋值一个中文字符串常量 例如 string s 中文字符串 变量s中保存的字节内容是什么 如果源文件的编码格式转换了 比
  • Python实现快乐的数字

    题目要求 编写一个算法来确定一个数字是否 快乐 快乐的数字按照如下方式确定 从一个正整数开始 用其每位数的平方之和取代该数 并重复这个过程 直到最后数字要么收敛等于1且一直等于1 要么将无休止地循环下去且最终不会收敛等于1 能够最终收敛等于
  • 浅谈 Spring Cloud Alibaba

    Spring Cloud Alibaba 一 什么是 Spring Cloud Alibaba 二 它能做什么 三 它的组件包括什么 四 如何使用 一 什么是 Spring Cloud Alibaba Spring Cloud Alibab
  • 【猿人学WEB题目专解】专栏通知

    据说 看我文章时 关注 点赞 收藏 的 帅哥美女们 心情都会不自觉的好起来 前言 作者简介 大家好我是 user from future 意思是 来自未来的用户 寓意着未来的自己一定很棒 个人主页 点我直达 在这里肯定能找到你想要的 专栏介
  • 使用Intellij idea创建一下java后台项目并实现第一个接口

    创建java后台项目 1 下载并安装Intellij idea 2 选择Create New Project 3勾选左侧的Spring Initializr 点击next 4 填写项目名称和包名 点击next 5 勾选左侧web 然后勾选中
  • 怎么用群晖webdav实现外网映射网络驱动器

    前几天刚作好群晖nas局域网内的磁盘映射功能 今天老板又想实现在家里也能跟在公司一样的方便访问映射功能 因为使用网页操作实在太麻烦了 这可怎么办官方提供的 Assistant工具只能操作局域网的 又没有独立的IP地址 只好求助技术支持了 还
  • springboot项目中解决SpringBoot上传图片后访问不到的问题

    1 解决SpringBoot上传图片后访问不到的问题 问题描述 前后端不分离项目 前端 thymeleaf 后端 mybatis springboot架构 在前端上传图片之后 上传到指定的本地路径 路径为 idea项目下的 resource
  • springboot security学习-01

    引入相关依赖