springboot security 权限不足_SpringBoot 整合 SpringSecurity 之起源篇(零)

dd0bd961746b4406a6cd2026f1a28f2c

本篇为SpringSecurity的第一篇,主要来介绍下什么是SpringSecurity,以及在springboot中如何使用它

I. 基本知识点

官方文档: https://docs.spring.io/spring-security/site/docs/5.2.2.BUILD-SNAPSHOT/reference/htmlsingle/#community-help

下面是官方介绍

Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.

Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements

用国语,简单抽象的说一下它的定义

  • 很的认证和访问权限校验框架

那么具体能干嘛?

  • 用户登录认证:用户名+密码登录,确定用户身份
  • 用户访问鉴权(常见的ACL访问控制列表,RBAC角色访问控制):判定是否有权限访问某个资源
  • 安全保护(CSRF跨站点攻击,Session Fixation会话固定攻击...)

II. 初体验

接下来我们看一下再springboot中如何使用springsecurity

1. 配置

首先得是spring boot项目,然后添加上security的依赖即可,相对完整的pom配置如下(注意我们使用的springboot版本为2.2.1.RELEASE)

org.springframework.boot    spring-boot-starter-parent    2.2.1.RELEASEUTF-8UTF-81.8org.springframework.boot        spring-boot-starter-security    org.springframework.boot        spring-boot-starter-web    org.springframework.boot                spring-boot-maven-plugin            spring-snapshotsSpring Snapshotshttps://repo.spring.io/libs-snapshot-localtruespring-milestonesSpring Milestoneshttps://repo.spring.io/libs-milestone-localfalsespring-releasesSpring Releaseshttps://repo.spring.io/libs-release-localfalse

2. 实例demo

上面配置完之后,啥都不需要干,项目已经接入了spring security;项目中的服务都需要登录之后才能访问

// 程序启动类@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }}// rest 服务@RestControllerpublic class IndexRest {    @GetMapping(path = {"/", "/index"})    public String index() {        return "hello this is index!";    }    @GetMapping(path = "hello")    public String hello(String name) {        return "welcome " + name;    }}

当我们需要访问首页时,会发现直接302重定向到登录页面了,如下图

4e838aced97d4f22958034fb038e3a15

spring security默认给我们生成了一个用户名为user,密码为控制台中输出的一行日志如Using generated security password: aa410186-5c04-4282-b217-507ffb1f61eb

登录之后会重定向回我们之前访问的url,通过抓包可以看到,登录成功之后,会设置请求方的cookie,后续的请求携带cookie来表明用户身份

261f4cc562214ce7bace546cb97ba7f4

3. 基本配置

上面虽然演示了一个hello world的初体验项目,但是这个默认的用户名/密码有点鬼畜,默认的配置主要来自于org.springframework.boot.autoconfigure.security.SecurityProperties.User,下面是截图(所以前面的用户名为user)

551d8463acb94bf5949504d13b491eb6

接下来我们需要配置为对人类友好的方式,在项目的配置文件application.yml中,指定登录的用户名/密码

spring:  security:    user:      name: yihuihui      password: 123456

重启测试项目,使用新的用户名/密码(yihuihui/123456)就可以登录成功了;

4. 用户身份获取

上面虽然是一个简单的case,但还有一点不得不提一下,在我的接口中,虽然知道你登录了,但怎么知道你是谁呢?

我们可以直接通过HttpServletRequest#getRemoteUser()的方法来获取登录用户; 或者通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()来获取授权信息

我们来写一个通用方法

public String getUser() {    return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getRemoteUser();}// orpublic Object getUser() {    SecurityContextHolder.getContext().getAuthentication().getPrincipal();}

然后稍微改一下我们的服务接口

@GetMapping(path = {"/", "/index"})public String index() {    return "hello this is index! welcome " + getUser();}

再次访问之后,结果如下

a43e96322cb74062ade4fed3d28a9344

5. 小结

本文主要是spring security系列的起源篇,第一节介绍了下什么是SpringSecurity,有什么特点

  • spring security是一个很的认证(可以简单理解为登录验证)和鉴权(可简单理解为访问控制)框架
  • 三大特点:登录 + 鉴权 + 安全防护

第二节介绍了一个简单入门的HelloWorld实例

  • springboot项目,添加依赖 spring-boot-starter-security; 所有的http接口访问都需要登录,默认提供一个用户名为user,密码为控制台输出的UUID字符串
  • 通过spring.security.user.name和spring.security.user.password来指定用户名密码
  • 通过HttpServletRequest#getRemoteUser()获取登录用户

那么问题来了,什么系统可能只有一个用户呢?要多用户怎么办?不同的用户不同的权限怎么办?某些接口所有人都可以访问又怎么办?

II. 其他

0. 项目

  • 工程:https://github.com/liuyueyi/spring-boot-demo
  • 代码: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-security/000-basic-demo

1. 一灰灰Blog

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

  • 一灰灰Blog个人博客 https://blog.hhui.top
  • 一灰灰Blog-Spring专题博客 http://spring.hhui.top

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

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

相关文章

java输入年份和月份,输出天数

java输入年份和月份,输出天数 import java.util.Scanner;/*** Switch case 实现从键盘录入年份月份,输出天数*/ public class Test02 {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入年…

java用switch语句根据分数输出学生等级

java用switch语句根据分数输出学生等级 /*** 从键盘上输入分数&#xff0c;计算等级gradescore/10;* <60,不及格&#xff0c;继续努力&#xff01;* 60-69,及格&#xff0c;仍需努力&#xff01;* 70-79,一般&#xff0c;继续加油&#xff01;* 80-89,良好&#xff0c;再接…

nacos 配置_SpringCloud Alibaba之Nacos配置中心

前言前几篇介绍了Nacos相关知识&#xff0c;又介绍了nacos作为注册中心&#xff1b;今天老顾就分享一些Nacos作为配置中心&#xff0c;如何使用&#xff1f;新建配置打开nacos控制台&#xff0c;操作配置列表设置DataId&#xff0c;Data ID它的定义规则是&#xff1a;${prefix}…

java用while循环语句输出1-100内的奇数和

java用while循环语句输出1-100内的奇数和 /*** 用while语句,输出0-100所有奇数和*/ public class Test04 {public static void main(String[] args) {int i 1; //定义变量时&#xff0c;尽量不要写成int i1,sum0;int sum 0; //养成一个好习惯while(i<100){if (i%…

如何成为一名与众不同的程序员?|面向思维做事

思维能力是比解决具体问题更重要的能力。问题也许各有不同&#xff0c;但思维方式可以复制和迁移。正所谓:"有道无术&#xff0c;术尚可求也&#xff0c;有术无道&#xff0c;止于术"。 引言 本书的首要目的就是打破“不知道自己不知道”的思维禁锢&#xff0c;把软件…

nofollow标签_nofollow标签是什么?如何使用

nofollow标签是什么可以这样来理解&#xff0c;我们做了一个网页&#xff0c;看到这个网页上有很多个链接&#xff0c;搜索引擎收录这个网页之后&#xff0c;这网页它有一定的权重&#xff0c;它就会来决定分配给这些链接各自的权重。nofollow标签是什么nofollow标签呢就是用来…

java输出1-100内的所有5的倍数,5个一行

java输出1-100内的所有5的倍数&#xff0c;5个一行 /*** 输出1-100内的所有5的倍数&#xff0c;5个一行*/ public class Test05 {public static void main(String[] args) {int i 1;int j 0; //j的初值为0,不是1&#xff1b;while(i<100){if (i%50) {System.out…

java从键盘输入一个数,并将其倒序输出

从键盘输入一个数&#xff0c;并将其倒序输出 import java.util.Scanner;/*** 从键盘上录入任意整数,倒叙输出*/ public class Test06 {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入一个整数&#xff1a;&qu…

python open函数_精选2个小例子,带你快速入门Python文件处理

阅读本文大概需要7分钟讲完了函数和模块&#xff0c;我们来讲一讲文件的使用,python对数据的处理分两种一种是本地文件的处理&#xff0c;另外一种是通过网络数据处理(也就是爬虫相关的).而本地的数据处理&#xff0c;主要是通过文件的读和写完成~~我们先想一想平时对文件处理一…

Java判断一个整数是否为水仙花数

判断一个整数是否为水仙花数 import java.util.Scanner;/*** 从键盘上输入一个数字&#xff0c;判断是不是水仙花数* <p>* 所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身* <p>* 例如&#xff1a;* 153 1*1*1 5*5*5 3*3*3 ;*/ public c…

mysql with as 用法_Python之图解with语句

在我们使用Python的时候&#xff0c;常使用到如下的代码块:# 文件读取 with open(file, r) as f:# CODE BLOCK ## 梯度计算 with tf.GradientTape() as g:# CODE BLOCK #在很多场景中&#xff0c;使用with语句来可以让我们可以更好地来管理资源和简化代码&#xff0c;它可以看做…

java实现从键盘上输入学生考试的科目和学生的每科分数,输出总分、最高分、最低分、平均分

java实现从键盘上输入学生考试的科目和学生的每科分数&#xff0c;输出总分、最高分、最低分、平均分 import java.util.Scanner;/*** 从键盘上输入学生考试的科目数和学生的每一科分数 输出总分、最高分、最低分、平均分*/ public class Test08 {public static void main(St…

aidl使用_Android进阶之AIDL如何使用自定义类型

如何在 AIDL 中使用自定义类型&#xff0c;具体步骤如下&#xff1a;创建自定义类型声明自定义类型定义与自定义类型相关的业务重写业务实体类远程调用验证 AIDL1. 创建自定义类型自定义类型传输的就是一个实体对象&#xff0c;这个实体类必须实现 Parcelable 接口&#xff0c;…

java判断一个整数是不是素数(质数)

java判断一个整数是不是素数&#xff08;质数&#xff09; /*** 判断一个数是不是素数&#xff08;质数&#xff09;* 质数是指在大于1的自然数中&#xff0c;除了1和它本身以外不再有其他因数的自然数。*/import java.util.Scanner;public class Test09 {public static void …

mysql获取时间戳_服了!阿里Mysql三位封神专家总结1200多页性能优化的千金良方...

MYSQL&#xff08;关系型数据库管理系统&#xff09;MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relatio…

java输出1-100之间的全部素数

java输出1-100之间的全部素数 public class Test10 {public static void main(String[] args) {int i 2;while (i < 100) {int num 2;boolean flag true;while (num < i) {if (i % num 0) {flag false;}num;}if (flag) {System.out.print(i"\t");}i;}} }…

java生成指定范围的随机数

java生成指定范围的随机数 /*** 如何在程序中生成指定范围的随机数** 生成23-59之间的随机数*/ public class Test11 {public static void main(String[] args) {/*** Math.random() 生成&#xff08;0,1&#xff09;之间的小数&#xff0c;不包括0和1* 所以生成23-59之间的随…

linux cached释放_正点原子Linux第四十一章嵌入式Linux LED驱动开发实验

1)资料下载:点击资料即可下载2)对正点原子Linux感兴趣的同学可以加群讨论&#xff1a;9354467413&#xff09;关注正点原子公众号&#xff0c;获取最新资料更新第四十一章嵌入式Linux LED驱动开发实验上一章我们详细的讲解了字符设备驱动开发步骤&#xff0c;并且用一个虚拟的c…

java模拟回合打怪游戏

java模拟回合打怪游戏 玩家的血值&#xff1a;w 315 怪物的血值&#xff1a;g 500 玩家和怪物互打 玩家每次攻击怪物产生5-8点伤害 怪物每次攻击玩家产生3-5点伤害 采用回合制&#xff0c;一方血量<0游戏结束 用java程序模拟战斗过程&#xff1a;&#xff08;用文字…

cad pu插件下载lisp_CAD自动编号lisp插件下载

点击上方 “CAD自学网 ” → 点击右上角“...” → 点选“设为星标 ★ ”为CAD自学网加上星标&#xff0c;即可及时收到干货啦&#xff01;左下角阅读原文看CAD视频好课推荐&#xff1a;1、CAD2014&#xff1a;点击查看 2、室内&全屋&#xff1a;点击查看 3、CAD2019&am…