【SpringSecurity】一、SpringSecurity入门

news2024/12/23 13:23:38

文章目录

  • 1、背景
  • 2、相关概念
  • 3、Java安全框架的实现
  • 4、入门案例
  • 4、使用配置文件配置用户名和密码
  • 5、基于内存的多用户管理

1、背景

新建个SpringBoot工程,写三个controller,里面有三个接口:

//学生
@RestController
@RequestMapping("/student")
public class StudentController {
    @GetMapping("/query")
    public String queryInfo(){
        return "this is a student,9527";
    }
}

//老师
@RestController
@RequestMapping("/teacher")
public class TeacherController {
    @GetMapping("/query")
    public String queryInfo(){
        return "this is a teacher,Mr.L";
    }
}

//管理员
@RestController
@RequestMapping("/admin")
public class AdminController {
    @GetMapping("/query")
    public String queryInfo(){
        return "this is a administrator, root";
    }
}

启动程序,此时不论是谁,访问这三个接口资源,都能成功返回信息。

curl -X GET localhost:9527/teacher/query

在这里插入图片描述

即没有加入安全框架的代码程序,默认所有资源均不受保护,可被随意访问,因此,需要集成安全框架。

2、相关概念

认证:

认证是为了保护系统的隐私数据与资源,用户的身份合法方可访问该系统的资源,常见的用户身份认证的方式有:

  • 用户名密码登录
  • 二维码登录
  • 手机短信登录
  • 指纹认证
  • 人脸识别

会话:

用户认证通过后,为了避免用户的每次操作都进行认证可将用户的信息保存在会话中。会话就是系统为了保持当前用户的登录状态所提供的机制。直白讲就是别每干一件事就查身份,给你个五年有效期的身份证,你带身上或者我帮你存着,有这个证明,在这期间你就不用再反复认证

常见的实现方式有基于session方式和基于token方式等

授权:

即认证通过后,也不是所有的资源都能访问。拥有资源的访问权限则正常访问,没有权限则拒绝访问

RBAC(Role-Based Access Control) 基于角色的访问控制

有很多权限,把权限一个一个加给用户很繁琐,所以 将一组权限打包给一个角色,再让用户和角色挂钩。说白了,一个角色就是一组权限。

在这里插入图片描述
一个用户可以拥有多个角色,一个角色可以被多个用户拥有。一个权限可以对应多个角色,一个角色可以对应多个权限。均为多对多,即RBAC底层最少需要5张表。

在这里插入图片描述

  • xc_user:用户表,存储所有用户的基本信息,姓名、邮箱…
  • xc_role:角色表,根据业务需求。角色的创建是为了方便给用户分配权限。(一个用户有多个角色,一个角色下也可以有多个用户,多对多,需要中间表,中间表存两个表的主键即可)
  • xc_user_role:用户角色表(中间表,用户和角色的关系表)
  • xc_menu:权限表,记录了菜单及菜单下的权限。权限,是对资源的访问控制。一个角色可拥有多个权限,一个权限可被多个角色所拥有。(角色与权限多对多,需要中间表)
  • xc_permission:角色权限表(中间表,角色和权限的关系表)

3、Java安全框架的实现

  • Shiro:轻量级的安全框架,提供认证、授权、会话管理、密码管理、缓存管理等功能
  • Spring Security:功能比Shiro强大,更复杂,权限控制细粒度更高,对OAuth2 支持更好,与Spring 框架无缝集合,使Spring Boot 集成很快捷。
  • 自己写:基于过滤器(filter)和AOP来实现,难度大,没必要

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

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

4、入门案例

给需要保护的微服务添加spring-boot-starter-security依赖即可。

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

<!--版本在父工程中取-->

此时再访问上面controller中的接口,就会被Spring Security拦截,且Spring Security还提供了一个登录界面。

在这里插入图片描述

使用默认用户user登录,密码在控制台可找到,是一个随机生成的UUID字符串:

在这里插入图片描述

使用curl访问:

curl -v -X GET -u"user:550e8400-e29b-41d4-a716-446655440000" http://localhost:9527/admin/query

在这里插入图片描述
退出登录则访问:

loclhost:port/logout

在这里插入图片描述

以上只是个入门案例,当然密码和用户肯定不是这么存的。

4、使用配置文件配置用户名和密码

添加配置:

spring:
  security:
    user:
      name: admin
      password: admin123

重启服务,此时控制台上不再为我们生成密码,用上面自己配置的密码登录即可:

在这里插入图片描述

当然这个还是临时给自己调试用的,生产环境不这么搞。接下来 看下源码实现,在application.yml 中 将鼠标指定到name那,按住ctrl键,单击鼠标左键

在这里插入图片描述

5、基于内存的多用户管理

在这里插入图片描述

在config目录下创建配置类:

@Configuration
public class MySecurityUserConfig {
    @Bean
    public UserDetailsService userDetailService() {
		//使用org.springframework.security.core.userdetails.User类来定义用户
        //定义两个用户
        UserDetails user1 = User.builder().username("liu").password("123456").roles("student").build();
        UserDetails user2 = User.builder().username("Mr.liu").password("123456").roles("teacher").build();
        //创建两个用户,信息存内存中
        InMemoryUserDetailsManager userDetailsManager = new InMemoryUserDetailsManager();
        userDetailsManager.createUser(user1);
        userDetailsManager.createUser(user2);
        return userDetailsManager;
    }

}

重启服务,访问接口,跳登录页面后,输入上面定义的用户名和密码,控制台报错:

在这里插入图片描述

这个是因为spring Sercurity强制要使用密码加密,当然我们也可以不加密,但是官方要求是不管你是否加密,都必须配置一个密码编码(加密)器

继续在MySecurityUserConfig类中定义bean:

/*
 * 从 Spring5 开始,强制要求密码要加密
 * 如果非不想加密,可以使用一个过期的 PasswordEncoder 的实例 NoOpPasswordEncoder,
 * 但是不建议这么做,毕竟不安全。
 *
 * @return
 */
@Bean
public PasswordEncoder passwordEncoder(){
    //不对密码进行加密,使用明文
    return NoOpPasswordEncoder.getInstance();
}

重启后再登录上面定义的用户,则可以登录成功。且此时,yaml配置文件中的用户名和密码就失效了。此时,有以下几个问题:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/911809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ORB-SLAM系列算法演进

ORB-SLAM算法是特征点法的代表&#xff0c;当前最新发展的ORB-SLAM3已经将相机模型抽象化&#xff0c;适用范围非常广&#xff0c;虽然ORB-SLAM在算法上的创新并不是很丰富&#xff0c;但是它在工程上的创新确实让人耳目一新&#xff0c;也能更好的为AR、机器人的算法实现落地。…

hive表的全关联full join用法

背景&#xff1a;实际开发中需要用到全关联的用法&#xff0c;之前没遇到过&#xff0c;现在记录一下。需求是找到两张表的并集。 全关联的解释如下&#xff1b; 下面建两张表进行测试 test_a表的数据如下 test_b表的数据如下&#xff1b; 写第一个full join 的SQL进行查询…

14.广义表

目录 一. 基本术语 二. 广义表的性质 三. 广义表与线性表的区别和联系 四. 广义表的基本运算 一. 基本术语 广义表&#xff08;又称列表Lists&#xff09;是n>0个元素的有限序列&#xff0c;其中每一个ai或者是原子&#xff0c;或者是一个广义表。 广义表通常记作&am…

电力防雷监测的综合防雷方案

电力行业是国家的重要基础设施之一&#xff0c;也是雷电天气下最容易受到雷击的设施之一。 雷电对电力设施的影响是巨大的&#xff0c;不仅会造成设备损坏或数据丢失&#xff0c;还会引发火灾、爆炸、中毒、交通事故等次生灾害&#xff0c;给社会带来严重的影响。 因此&#xf…

【并发编程】详解并发编程中Synchronized的特性(可见性、有序性、可重入性、禁止指令重排序)(๑•̀ㅂ•́)و✧

1、synchronized 禁止指令重排分析 我们先看如下代码&#xff1a; class MonitorExample {int a 0;public synchronized void writer() { //1a; //2} //3public synchronized void reader() { //4int i …

[保研/考研机试] KY212 二叉树遍历 华中科技大学复试上机题 C++实现

题目链接&#xff1a; 二叉树遍历_牛客题霸_牛客网二叉树的前序、中序、后序遍历的定义&#xff1a; 前序遍历&#xff1a;对任一子树&#xff0c;先访问根&#xff0c;然后遍历其左子树&#xff0c;最。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/43719512169…

开学必备物品清单!这几款优先考虑!

​马上就要开学了&#xff0c;同学们也要准备一系列开学用品&#xff0c;方便我们的学习生活&#xff0c;那有哪些数码物品可以在开学前准备的呢&#xff0c;接下来给大家安利几款很不错很实用的数码好物&#xff01; 推荐一&#xff1a;南卡00压开放式蓝牙耳机 南卡00压开放式…

青源Workshop丨AI+心理干预研讨会

青源Workshop丨No.23 AI心理干预 当前&#xff0c;抑郁症、焦虑症等心理障碍成为社会关注的焦点&#xff0c;如何有效地缓解和治疗这些心理问题成为一个重要的研究方向。在这样的背景下&#xff0c;如何利用AI等先进技术手段来辅助心理疾病的治疗备受关注。例如&#xff0c;通过…

【FM-CW雷达】一种通信系统技术——调频连续波信号(FM-CW)(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

英伟达™(NVIDIA®)535.98 Linux 图形驱动程序发布

导读英伟达™&#xff08;NVIDIA&#xff09;公司近日发布了适用于 Linux、FreeBSD 和 Solaris 系统的 NVIDIA 535.98 图形驱动程序&#xff0c;作为其生产分支的维护更新&#xff0c;解决了各种错误和问题。 在英伟达™&#xff08;NVIDIA&#xff09;535.86.05 版本发布仅三周…

Java“牵手”根据关键词搜索(分类搜索)拼多多商品列表页面数据获取方法,拼多多API实现批量商品数据抓取示例

拼多多商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取拼多多商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问拼多多商城的网页来获取商品列表和详情信息。以下是两种常用方…

git常用操作命令(不定时更新)

git常用操作命令 将某个分支的某次提交迁移到另外一个分支查询这次提交的ID号方法一方法二 切换到目标分支执行commitID合并指令 将某个分支的某次提交迁移到另外一个分支 查询这次提交的ID号 方法一 方法二 切换到目标分支 git checkout 目标分支名 执行commitID合并指令 gi…

LSTM数学计算公式

LSTM&#xff08;长短期记忆网络&#xff09;是一种循环神经网络&#xff08;RNN&#xff09;的变体&#xff0c;常用于处理时间序列相关的任务。下面将简要介绍LSTM的数学推导和公式模型。 在训练一般神经网络模型时&#xff0c;通常用,其中W为权重&#xff0c;X为输入&#…

html动态爱心代码【二】(附源码)

目录 前言 效果演示 内容修改 完整代码 总结 前言 七夕马上就要到了&#xff0c;为了帮助大家高效表白&#xff0c;下面再给大家带来了实用的HTML浪漫表白代码(附源码)背景音乐&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;表白等场景&#xff0c…

API自动化管理: 从繁琐到轻松

在数字化时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;在软件开发中扮演着至关重要的角色。然而&#xff0c;API管理可能会变得十分繁琐&#xff0c;耗费大量时间和资源。那么&#xff0c;如何实现API自动化管理&#xff0c;从而节省时间、提高效率&#xff0c…

Fedora Linux 的家族(三):实验室

导读本文将对 Fedora Linux 实验室版本进行更详细的介绍。 根据个人需求&#xff0c;每个人使用计算机的方式都不同。你可能是一位设计师&#xff0c;需要在计算机上安装各种设计软件。或者你可能是一位游戏玩家&#xff0c;所以需要一个支持你喜欢的游戏的操作系统。有时候我们…

智慧医院的信息集成平台建设与配电设计方案-安科瑞黄安南

摘要&#xff1a;随着云计算、5G、大数据、物联网等技术的不断发展与进步&#xff0c;推动着智慧医院建设的飞速发展。智慧医院建设强调医院内部业务的多流程联动和医疗信息互联互通的高协同效率&#xff0c;突出了数据驱动下构建高质量数据的必要性。文章提出并分析智慧医院发…

【微服务】微服务调用原理及服务治理

本文通过图文结合&#xff0c;简要讲述微服务的调用原理&#xff0c;以及服务治理的相关概念。 1.微服务的调用原理 举个栗子&#xff1a;你去会所洗脚。首先&#xff0c;技师肯定要先去会所应聘&#xff0c;通过之后&#xff0c;会所会记录该技师的信息和技能&#xff0c;然后…

uni-app打包后安卓不显示地图及相关操作详解

新公司最近用uni-app写app&#xff0c;之前的代码有很多问题&#xff0c;正好趁着改bug的时间学习下uni-app。 问题现象&#xff1a; 使用uni-app在浏览器调试的时候&#xff0c;地图是展示的&#xff0c;但是打包完成后&#xff0c;在app端是空白的。咱第一次写app&#xff…

TCP的可靠性之道:确认重传和流量控制

TCP 全称为 Transmission Control Protocol&#xff08;传输控制协议&#xff09;&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;其中可靠性是相对于其他传输协议的优势点。TCP 为了确保数据传输的可靠性主要做了以下几点&#xff1a; 发送确…