本篇为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重定向到登录页面了,如下图

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

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

3. 基本配置

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

接下来我们需要配置为对人类友好的方式,在项目的配置文件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();}

再次访问之后,结果如下

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

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

  1. springboot security 权限不足_springBoot整合springSecurity(零一)

    整体结构===>>> 1,springboot2.0整合springSecurity5.1.1 2,mysql--->>InnoDB 3,持久层我用的是用Mybatiys ...

  2. springboot security 权限校验_springboot借助aop和注解实现权限校验

    我们用springboot做后台开发,难免会用到权限校验,比如查看当前用户是否合法,是否是管理员.而spring的面向切面的特效可以帮助我们很好的实现动态的权限校验.这里我们就用到的spring的ao ...

  3. IdaP02: springboot security权限控制篇

    通过狂神发布在B站的视频,了解到spring security(以下简称ss)在权限控制的强大好用,故学之. 一.详细例子 数据库 pom.xml 导入必要的包 <!-- security和th ...

  4. @builder注解_SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证

    一.说明 SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更 ...

  5. springboot 按钮权限验证_springboot学习之权限系统登录验证SpringSecurity

    SpringSecurity核心功能:认证.授权.攻击防护(防止伪造身份) 涉及的依赖如下: org.springframework.boot spring-boot-starter-security ...

  6. springboot security 权限校验_十二、SpringBoot 优雅的集成Spring Security

    前言 至于什么是Spring security ,主要两个作用,用户认证和授权.即我们常说的,用户只有登录了才能进行其他操作,没有登录的话就重定向到登录界面.有的用户有权限执行某一操作,而有的用户不能 ...

  7. springboot 引入jdbc驱动_SpringBoot整合jdbc、durid、mybatis详解,数据库的连接就是这么简单...

    SpringBoot底层统一采用SpringData处理数据库,这一章主要来讲一下SpringBoot整合jdbc.durid.mybatis的方式. (一)整合jdbc 整合jdbc主要有三步: 1 ...

  8. springboot数据源不正确_SpringBoot整合多数据源的巨坑!!!

    导读 本篇文章接上篇SpringBoot整合多数据源,你会了吗?,前面文章最后留了几个问题供大家思考,今天一一揭晓. 配置如何优化 上文整合的过程中的还顺带整合Mybatis和TransactionM ...

  9. springboot 按钮权限验证_SpringBoot中实现Shiro控制ThymeLeaf界面按钮级权限控制

    需求简述 在业绩核算系统中,我们使用了SpringBoot作为项目的整体架构,使用ThymeLeaf作为前端界面框架,使用Shiro作为我们的权限控制框架,Shiro作为轻量级的权限框架,使用起来非常 ...

最新文章

  1. linux命令的学习
  2. UVA11624_Fire!
  3. wizard generated application - how is detail page rendered
  4. mysql的操作语句_Mysql最常用的操作语句收集
  5. python利用thinker制作多页面切换的桌面应用实例教程
  6. trie树和后缀树的应用
  7. 5nm及3nm推动 台积电2024及2025年产能将主要集中在台南科学园
  8. Android SQLite用法
  9. C# 中关于汉字与16进制转换的代码
  10. [Usaco2009 Feb]Revamping Trails 堆优化 Dijkstra
  11. SHELL脚本也要函数化
  12. 洛谷P1878 舞蹈课 贪心 堆
  13. linux统计文件大小大于100k,Centos / Linux设置logrotate为所有日志的最大文件大小
  14. 什么是交互设计?交互设计师是做什么的?
  15. 详细理解TDMA以及OFDMA,更容易读懂论文
  16. Nuxt开发中The client-side rendered virtual DOM tree is not matching server-rendered content.的问题
  17. 2021.2.22学习总结
  18. Linux 下串口编程(C++ 程序设计)
  19. 解决win10系统文件资源管理器一直未响应的问题
  20. 基于CAN的网络管理

热门文章

  1. faster rcnn resnet_RCNN, Fast R-CNN 与 Faster RCNN理解及改进方法
  2. java安卓浏览器下载文件,JAVA实现文件下载,浏览器端得到数据没反应解决方案
  3. 计算机里的东西太多,电脑里的东西太多,怎么样清理一下啊
  4. java 对象流传输socket_Java Socket(二)使用TCP传输对象
  5. 猎豹浏览器截图在哪 猎豹浏览器如何截图
  6. 深入理解call、apply、bind(改变函数中的this指向)
  7. java 线程安全的原因_java的多线程:java安全问题产生的原因与JMM的关系
  8. Arrays.asList()和Collections.singletonList()比较
  9. SpringBoot 使用AOP功能
  10. Map的value转化为其它类型