Spring Security

SpringSecurity框架下实现CSRF跨站攻击防御

十年热恋 提交于 2019-12-09 08:01:27
一、什么是CSRF 很多朋友在学习Spring Security的时候,会将CORS(跨站资源共享)和CSRF(跨站请求伪造)弄混,以为二者是一回事。其实不是,先解释一下: CORS(跨站资源共享)是局部打破同源策略的限制,使在一定规则下HTTP请求可以突破浏览器限制,实现跨站访问。 CSRF是一种网络攻击方式,也可以说是一种安全漏洞,这种安全漏洞在web开发中广泛存在。 当我们使用Spring Security的时候,这种CSRF漏洞默认的被防御掉了。但是你会发现在跨域请求的情况下,我们的POST、DELETE、PUT等HTTP请求方式失效了。所以在笔者之前的文章中,我们使用 http.csrf.disable() 暂时关闭掉了CSRF的防御功能,但是这样是不安全的,那么怎么样才是正确的做法呢?就是本文需要向大家介绍的内容。 二、CSRF的攻击方式 通常的CSRF攻击方式如下: 你登录了网站A,攻击者向你的网站A账户发送留言、伪造嵌入页面,带有危险操作链接。 当你在登录状态下点击了攻击者的连接,因此该链接对你网站A的账户进行了操作。 这个操作是你在网站A中主动发出的,并且也是针对网站A的HTTP链接请求,同源策略无法限制该请求。 三、如何防御CSRF攻击 为系统中的每一个连接请求加上一个token,这个token是随机的,服务端对该token进行验证

springboot shiro

不问归期 提交于 2019-12-07 20:33:40
最近研究后端的权限管理,一般两个选择shiro和spring security,都说shiro相对简单,就先用他,后面在去研究spring security。 具体的内容介绍不多介绍了,找了两个大佬写的博客,讲的挺不错,链接贴上 https://segmentfault.com/a/1190000011918957 https://www.cnblogs.com/ll409546297/p/7815409.html 然后比葫芦画瓢自己写的代码也贴上来看看,相关地方都已加上注释 ShiroConfiguration文件的内容 package com.example.web.controller; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.springframework.context.annotation

Springsecurity-oauth2之/oauth/token的处理

a 夏天 提交于 2019-12-07 17:39:43
Springsecurity-oauth2的版本是2.2.1.RELEASE. 使用postman进行/oauth/token的时候,服务端Springsecurity是怎么处理的呢? 图1 图2 图3 上面的图2和图3,我们就会从服务端获得token。 来看BasicAuthenticationFilter的实现,如下List-1所示 List-1 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { boolean debug = this.logger.isDebugEnabled(); String header = request.getHeader("Authorization"); if (header != null && header.startsWith("Basic ")) { try { String[] tokens = this.extractAndDecodeHeader(header, request); assert tokens.length == 2; String username = tokens[0]

SpringSecurity & OAuth2实现短信验证码方式获取AccessToken

左心房为你撑大大i 提交于 2019-12-07 04:31:32
Spring 提供的原生的 OAuth2 依赖内置了几种比较常用的授权方式: password 、 authorization-code 、 client_credentials 、 refresh_token 、 implicit 等,虽然可以满足我们日常的需求,不过针对一些特殊的需求还是捉襟见肘,有点无奈,比如: 微信登录 、 短信登录 ...,针对这一点 ApiBoot 通过修改 Spring OAuth2 依赖的源码,可以根据业务进行自定义添加 grantType 。 <!--more--> ApiBoot官方文档: http://apiboot.minbox.io 创建项目 我们先来使用 IDEA 创建本章的项目, pom.xml 添加的依赖如下所示: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.minbox.framework</groupId> <artifactId>api-boot-starter-security-oauth-jwt</artifactId> </dependency>

SpringSecurity & OAuth2实现短信验证码方式获取AccessToken

喜你入骨 提交于 2019-12-07 04:19:52
Spring 提供的原生的 OAuth2 依赖内置了几种比较常用的授权方式: password 、 authorization-code 、 client_credentials 、 refresh_token 、 implicit 等,虽然可以满足我们日常的需求,不过针对一些特殊的需求还是捉襟见肘,有点无奈,比如: 微信登录 、 短信登录 ...,针对这一点 ApiBoot 通过修改 Spring OAuth2 依赖的源码,可以根据业务进行自定义添加 grantType 。 <!--more--> ApiBoot官方文档: http://apiboot.minbox.io 创建项目 我们先来使用 IDEA 创建本章的项目, pom.xml 添加的依赖如下所示: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.minbox.framework</groupId> <artifactId>api-boot-starter-security-oauth-jwt</artifactId> </dependency>

SpringSecurity & OAuth2实现短信验证码方式获取AccessToken

﹥>﹥吖頭↗ 提交于 2019-12-06 16:45:40
Spring 提供的原生的 OAuth2 依赖内置了几种比较常用的授权方式: password 、 authorization-code 、 client_credentials 、 refresh_token 、 implicit 等,虽然可以满足我们日常的需求,不过针对一些特殊的需求还是捉襟见肘,有点无奈,比如: 微信登录 、 短信登录 ...,针对这一点 ApiBoot 通过修改 Spring OAuth2 依赖的源码,可以根据业务进行自定义添加 grantType 。 <!--more--> ApiBoot官方文档: http://apiboot.minbox.io 创建项目 我们先来使用 IDEA 创建本章的项目, pom.xml 添加的依赖如下所示: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.minbox.framework</groupId> <artifactId>api-boot-starter-security-oauth-jwt</artifactId> </dependency>

你知道你对 JSON Web Token 的认识存在误解吗

自作多情 提交于 2019-12-06 13:04:27
1.前言 JSON Web Token (JWT) 其实目前已经广为软件开发者所熟知了,但是 JOSE (Javascript Object Signing and Encryption) 却鲜有人知道,我第一次知道它是在 Spring Security 的官方文档中,它改变了我对 JWT 的一些认识。目前国内能找到相关中文资料不是太多。所以我觉得有必要归纳一下。 2. JOSE 概述 JOSE 是一种旨在提供在各方之间安全传递声明(claims)的方法的规范集。我们常用的 JWT 就包含了允许客户端访问特定应用下特定资源的声明。 JOSE 制定了一系列的规范来达到此目的。目前该规范还在不断的发展,我们常用的包含以下几个 RFC : JWS(RFC 7515) -JSON Web签名,描述生成和处理签名消息 JWE(RFC 7516) -JSON Web加密,描述了保护和处理加密 消息 JWK(RFC 7517) -JSON Web密钥,描述 Javascript 对象签名和加密中加密密钥的 格式和处理 JWA(RFC 7518) -JSON Web算法,描述了 Javascript 对象签名和加密中使用的 加密 算法 JWT(RFC 7519) -JSON Web令牌,描述以 JSON 编码并由 JWS 或 JWE 保护的声明的表示形式 3. 我们都看错了 JWT 看了对 JWT

SpringSecurity环境下配置CORS跨站资源共享规则

怎甘沉沦 提交于 2019-12-06 11:39:44
一、CORS简述 要说明CORS(Cross Origin Resourse-Sharing) 跨站资源共享,就必须先说同源策略。长话短说,同源策略就是向服务端发起请求的时候,以下三项必须与当前浏览器应用一致:域名、端口、协议。用白话说:就是你的应用发送请求不能访问别人的资源,否则浏览器就会限制你。当然也有例外,如:img、srcipt、iframe等资源引用的HTML标签不受同源策略的限制。 但是我们实际开发中又经常会跨站访问,比如前后端分离的应用是分开部署的,在浏览器看来是两个域。所以同源策略是用来禁止跨域访问的,CORS正好相反是根据自己的需求与规则,有限的开放部分资源的共享。 二、Spring-CORS规则基础配置 想在Spring或Spring Boot的web环境下实现跨域资源共享,主要有三种实现方式: @CrossOrigin注解,这个注解是作用于Controller类或者请求方法上的,实现局部接口的跨域资源共享。 实现WebMvcConfigurer接口addCorsMappings方法,实现全局配置的跨域资源共享。 注入CorsFilter过滤器,实现全局配置的跨域资源共享。推荐使用。 这三种实现方式在我的另外一篇文章 《SpringBoot解决跨域访问的问题》 中已经介绍过,这里就不多做说明了。 三、Spring Security 中的配置CORS

看完这篇文章你还感觉SpringSecurity整合OAuth2自定义查询用户复杂吗?

∥☆過路亽.° 提交于 2019-12-06 09:59:20
SpringSecurity 整合 OAuth2 是开发者公认的 资源保护 、 服务认证 的最佳搭配伙伴,这对好基友一直在默默的守护着应用服务的安全,根据访问者的不同角色可以颗粒度控制到具体的接口,从而实现权限的细微划分。 而 SpringSecurity 框架在安全框架的队伍中算是入门比较高的,虽然 Spring 通过 SpringBoot 进行了封装,但是使用起来还是有很多容易遗漏的配置,因为配置比较多,让初学者理解起来也比较困难,针对这个问题 ApiBoot 对 SpringSecurity 以及 OAuth2 进行了封装,在基础上极大的简化了配置(只做简化、增强, SpringSecurity 的基础语法、配置还可以正常使用) ApiBoot Security 系列文章 ApiBoot实现零代码整合Spring Security & OAuth2 ApiBoot零代码整合Spring Security的JDBC方式获取AccessToken 创建项目 使用 IDEA 开发工具创建一个 SpringBoot 项目。 ApiBoot 的底层是 SpringBoot ,而且 ApiBoot 为了支持 SpringBoot 的 2.2.x 分支,也对应的创建了 2.2.x 分支版本。 添加ApiBoot统一依赖 创建完项目后我们需要在 pom.xml 添加 ApiBoot

SpringSecurity代码实现JWT接口权限授予与校验

£可爱£侵袭症+ 提交于 2019-12-06 09:34:07
通过笔者前两篇文章的说明,相信大家已经知道JWT是什么,怎么用,该如何结合Spring Security使用。那么本节就用代码来具体的实现一下JWT登录认证及鉴权的流程。 一、环境准备工作 建立Spring Boot项目并集成了Spring Security,项目可以正常启动 通过controller写一个HTTP的GET方法服务接口,比如:“/hello” 实现最基本的动态数据验证及权限分配,即实现UserDetailsService接口和UserDetails接口。这两个接口都是向Spring Security提供用户、角色、权限等校验信息的接口 如果你学习过Spring Security的formLogin登录模式,请将HttpSecurity配置中的formLogin()配置段全部去掉。因为JWT完全使用JSON接口,没有from表单提交。 HttpSecurity配置中一定要加上csrf().disable(),即暂时关掉跨站攻击CSRF的防御。这样是不安全的,我们后续章节再做处理。 以上的内容,我们在之前的文章中都已经讲过。如果仍然不熟悉,可以翻看本号之前的文章。 二、开发JWT工具类 通过maven坐标引入JWT工具包jjwt <dependency> <groupid>io.jsonwebtoken</groupid> <artifactid>jjwt<