当前位置: 首页 > news >正文

SpringBoot Security 入门

文章目录

  • 初始化
  • 自定义用户和密码
  • 数据库校验
    • 配置类
    • 安全认证
    • 获取用户信息

初始化

pom 文件添加依赖,SpringBoot 版本 2.7.4

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

添加依赖后,在浏览器请求接口,会弹出登录页面
默认登录账号是:user
密码在运行后台有打印
在这里插入图片描述
输入账号密码后,接口可以正常访问,nice,入门了

 

自定义用户和密码

深入源码可以看到
默认用户名是 user
默认密码是 uuid
在这里插入图片描述
 
所以修改默认用户名和密码也很简单

spring:
  security:
    user:
      name: myname
      password: 123

 

数据库校验

springboot 配置 MYSQL ,参考文章

注意:低版本的 security 使用 WebSecurityConfigurerAdapter 配置,但这个类新版已经被放弃了
在这里插入图片描述
 

配置类

  • anyRequest().authenticated():任务静态资源都必须通过校验
  • formLogin():开启登录页面进行用户验证
  • antMatchers:哪些接口可以不需要权限校验
@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .authorizeHttpRequests()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
        ;
        return http.build();
    }

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return web -> web.ignoring().antMatchers("/test/**");
    }
}

 

安全认证

实现 AuthenticationProvider 接口

  • authenticate():判断用户名密码是否正确
  • BadCredentialsException:校验错误的异常类
  • UsernamePasswordAuthenticationToken:校验正确时,返回根据用户名、密码、权限生成的 token
  • supports:暂无用
  • userDetailsService.loadUserByUsername:获取用户信息,然后比较数据库存储的密码和传入的密码是否一致
@Component
@Slf4j
public class SelfAuthenticationProvider implements AuthenticationProvider {

    @Resource
    SelfUserDetailsService userDetailsService;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String userName = (String) authentication.getPrincipal();
        String password = (String) authentication.getCredentials();
        log.info("userName:{}, password:{}", userName, password);

        if (StringUtils.isBlank(userName)) {
            log.error("用户名不能为空");
            throw new BadCredentialsException("用户名不能为空");
        } else if (StringUtils.isBlank(password)) {
            log.error("密码不能为空");
            throw new BadCredentialsException("密码不能为空");
        }

        UserDetails userInfo =  userDetailsService.loadUserByUsername(userName);
        String myPassword =  userInfo.getPassword();
        log.info("数据库存的密码:{}",myPassword);

        if (!password.equals(myPassword)) {
            log.error("用户名密码不正确");
            throw new BadCredentialsException("用户名或密码错误");
        } else {
            return new UsernamePasswordAuthenticationToken(userInfo, password, userInfo.getAuthorities());
        }
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return true;
    }
}

 

获取用户信息

继承 UserDetailsService

  • IUserMapper :根据用户名查询用户信息
  • User:新建用户类,位于 org.springframework.security.core.userdetails
@Service
@Slf4j
public class SelfUserDetailsService implements UserDetailsService {

    @Resource
    IUserMapper userMapper;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        QueryWrapper<UserPO> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", username);
        UserPO userPO = userMapper.selectOne(queryWrapper);
        log.info(" user: {}", userPO);

        if (userPO == null) {
            throw new BadCredentialsException("没有此用户!");
        }

        User userInfo = new User(username, userPO.getPassword(), new ArrayList<>());
        return userInfo;
    }
}

相关文章:

  • STM32单片机PID控制数控恒流源-100mA~+100mA输出正负恒流源
  • Hadoop 3.x(生产调优手册)----【HDFS--核心参数】
  • Go Machine Learning
  • 【git】关于Git这一篇就够了
  • 什么 ? 陪玩都月入过忘拉~这不得python采集一下
  • 基于springboot服饰电商平台的设计与开发-计算机毕业设计源码+LW文档
  • 【STM32】硬件资源及芯片介绍
  • SpringMVC实现文件的上传和下载
  • Android 系统jni到hal层回调代码
  • 初入算法(2)—— 进入算法世界
  • 运行谷歌开源BERT程序时遇到的bug修改记录
  • 算法学习入门
  • 【SSM】spring核心思想——IOC和DI
  • 自由的程序员应该学会自由地控制空间-----动态内存管理
  • [架构之路-51]:架构师 - 用系统化、结构化思维解决复杂难搞的软件故障问题 - 马克思主义哲学在软件系统中的应用
  • 「面试题」如何实现一个圣杯布局?
  • js中的正则表达式入门
  • Node + FFmpeg 实现Canvas动画导出视频
  • Redash本地开发环境搭建
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 基于web的全景—— Pannellum小试
  • 手写双向链表LinkedList的几个常用功能
  • 一个JAVA程序员成长之路分享
  • ​ArcGIS Pro 如何批量删除字段
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #define、const、typedef的差别
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (6)添加vue-cookie
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (ZT)出版业改革:该死的死,该生的生
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)Sql Server 保留几位小数的两种做法
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET 服务 ServiceController
  • ??eclipse的安装配置问题!??
  • [1204 寻找子串位置] 解题报告
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [bzoj1324]Exca王者之剑_最小割
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件
  • [HackMyVM]靶场 Wild
  • [Hive] CTE 通用表达式 WITH关键字
  • [InnoDB系列] -- SHOW INNODB STATUS 探秘
  • [iOS]-网络请求总结
  • [JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]
  • [kubernetes]控制平面ETCD
  • [LeetCode]剑指 Offer 40. 最小的k个数
  • [NOI2022] 众数 题解
  • [NOIP2011DAY1P1]铺地毯
  • [one_demo_16]直接插入排序的demo
  • [R] data.frame() creates list?
  • [UI5 常用控件] 08.Wizard,NavContainer