Spring Security基础

  1. 简介

Spring是非常流行和成功的Java应用开发框架,Spring Security正是Spring家族中的成员。 Spring Security基于Spring框架,提供了一套Web应用安全性的完整解决方案。

Spring Security关于安全方面的两个主要区域是“认证”和“授权”(或者访问控制),一般来说,Web应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是Spring Security重要核心功能。

Spring Security基础_第1张图片

(1)用户认证

验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。通俗点说就是系统认为用户是否能登录。

(2)用户授权

用户授权指的是验证某个用户是否有权限执行某个操作。

在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。通俗点说就是系统判断用户是否有权限去做某些事情。

(3)Spring Security 特点

  • 和Spring 无缝整合

  • 全面的权限控制

  • 专门为Web开发而设计

  • 旧版本不能脱离Web环境使用

  • 新版本对整个框架进行了分层抽取,分成了核心模块和Web模块。单独引入核心模块就可以脱离Web环境。

  • 重量级

一般来说,常见的安全技术栈的组合是这样的:

SSM + Shiro

Spring Boot/Spring Cloud + Spring Security

自从有了Spring Boot 之后,Spring Boot 对于 Spring Security 提供了自动配置方案,可以使用更少的配置来使用Spring Security .

  1. 入门案例

(1)创建一个工程

Spring Security基础_第2张图片

(2)导入依赖

Spring Security基础_第3张图片
Spring Security基础_第4张图片

spring-boot-starter 后面加上web

(3)测试方法

Spring Security基础_第5张图片

(4)设置端口号(可不设置)

(5)启动(跳转到登录页面)

Spring Security基础_第6张图片

账户默认为user , 密码在启动时会在控制台 输出

Spring Security基础_第7张图片

(6)在浏览器输入访问路径

Spring Security基础_第8张图片

  1. Spring Security 本质

Spring Security 本质是一个过滤器链(有很多过滤器)。

重点看三个过滤器:

(1)Filter Security Interceptor

是一个方法级的权限过滤器,基本位于过滤器链的最底部。

(2)Exception Translation Filter

是一个异常过滤器,用来处理在认证授权过程中抛出的异常

(3)Username Password Authentication Filter

对/login的POST请求做拦截,校验表单中用户名,密码

(4)过滤器是如何进行加载的?

  1. 使用Spring Security 配置过滤器

*Delegating Filter Proxy

调用initDelegate 初始化方法

Spring Security基础_第9张图片

初始化方法initDelegate

Spring Security基础_第10张图片

执行initDelegate 内置的方法FilterChainProxy

Spring Security基础_第11张图片

FilterChainProxy中调用doFilterInternal

Spring Security基础_第12张图片

List filters = this.get Filters((HttpServltRequest)firewallRequest);最终将过滤链中的所有过滤器进行加载。

Spring Security基础_第13张图片

This.get Filters 方法 把过滤器加载到过滤器中

Spring Security基础_第14张图片

Get Filters 里面的有个对象 Security Filter Chain

Spring Security基础_第15张图片

最终返回所有过滤器,把Filter集合加载到过滤链

  1. 两个重要的接口

(1)User Details Service 接口

当什么也没有配置的时候,调用Username Password Authentication Filter

方法,账号和密码是由Spring Security定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的。所以我们要通过自定义逻辑控制认证逻辑。

如果需要自定义逻辑时,只需要实现User Details Service接口即可。

接口定义如下:

创建类继承Username Password Authentication Filter ,重写三个方法。

创建类实现User Detail Service ,编写查询数据过程,返回User对象,这个User对象是安全框架提供对象。

(2)Password Encoder

数据加密接口,用于返回User对象里面密码加密。

B Crypt Password Encoder是Spring Security官方推荐的密码解析器。

B Crypt Password Encoder是对b crypt强散列方法的具体实现。是基于Hash算法实现的单向加密。可以通过strength控制加密强度,默认10.

方法演示:

Spring Security基础_第16张图片

  1. web权限方案

(1)设置登录的用户名和密码

方式一:通过配置文件

在application.properties 配置文件中 设置账户和密码 :

方式二:通过配置类

使用B Crypt Password Encoder 对象调用encode方法对密码进行加密。

Spring Security基础_第17张图片

启动项目,点击登录会抛出一个异常:

密码加密需要用到Password Encoder 接口,所以在使用时调用 Password Encoder 方法

Spring Security基础_第18张图片

方式三:自定义编写实现类

Spring Security基础_第19张图片

Spring Security基础_第20张图片

(2)实现数据库认证来完成用户登录

第一步:引入依赖

Spring Security基础_第21张图片

第二步:创建数据库

Spring Security基础_第22张图片

create table users
(
    id  int auto_increment
        primary key,
    username varchar(100) null,
    password varchar(100) null
);

第三步:创建users表对应的实体类

Spring Security基础_第23张图片

第四步:整合mp ,创建接口,继承mp接口

第五步:在My User Details Service调用mapper里面的方法查询数据库进行用户认证

Spring Security基础_第24张图片

在接口中添加@Repository 注解 ,可以解决注入Users Mapper 时 的爆红问题。

第六步:在启动类添加注解MapperScan

Spring Security基础_第25张图片

第七步:在application.properties 中配置MySQL连接信息

(3)在2的基础上自定义登录页面

第一步:在配置类实现相关配置

Spring Security基础_第26张图片

第二步:创建页面,编写接口

Spring Security基础_第27张图片

(4)基于角色或权限进行访问控制

方法一:has Authority 方法

如果当前的主体具有指定的权限,则返回true,否则返回false .

只能设置一个用户的访问权限,设置两个会返回403。

第一步:在配置类设置当前访问地址有哪些权限

第二步:在User Details Service , 把返回User 对象设置权限

第一步和第二步的名称要对应,不然会返回type = Forbidden , status = 403

方法二:has Any Authority 方法

可设置多个访问用户,有一个对应即可。

如果当前的主体有任何提供的角色(给定的作为一个逗号分隔的字符串列表)的话,返回true.

方法三:has Role 方法

如果用户具备给定角色就可以访问,否则出现403.

如果当前的主体有指定的角色,则返回true.

功能和has Any Authority 差不多,但是has Role 会在前面加上前缀 ROLE_ .

Spring Security基础_第28张图片

方法四:has Any Role 方法

表示用户具备任何一个条件都可以访问。

使用方法和方法二相同。

(5)自定义403没有访问权限页面

Spring Security基础_第29张图片

(6)使用的注解

@Secured

用户具有某个角色,可以访问方法。

第一步:启动类(配置类)开启注解

第二步:在controller 的方法上面使用注解,设置角色

Spring Security基础_第30张图片

第三步:user Details Service设置角色

@PreAuthorize

进入方法前的权限认证,@PreAuthorize可以将登录用户的roles/permissions参数传到方法中。

第一步:启动类(配置类)开启注解

第二步:在controller 的方法上面使用注解

Spring Security基础_第31张图片

@Post Authorize

在方法这些后再进行权限验证,适合验证带有返回值的权限。

第一步:启动类(配置类)开启注解

第二步:在controller 的方法上面使用注解

Spring Security基础_第32张图片

@Post Filter

表达式中的filterObject引用的是方法返回值List中的某一个元素。

Spring Security基础_第33张图片

@PreFilter

进入控制器之前对数据进行过滤。

Spring Security基础_第34张图片

(7)用户注销

步骤一:在配置类添加退出的配置

步骤二:测试

创建页面

Spring Security基础_第35张图片

配置路径

Spring Security基础_第36张图片

退出之后是无法访问需要登录时才能访问的控制器。

(8)基于数据库记住我

实现原理

Spring Security基础_第37张图片

Spring Security基础_第38张图片

自动登录

cookle技术

安全框架机制实现自动登录

功能实现

步骤一:创建表

Spring Security基础_第39张图片

步骤二:配置类,注入数据源,配置操作数据库对象

Spring Security基础_第40张图片

步骤三:配置类配置自动登录

步骤四:在登录页面添加复选框

Spring Security基础_第41张图片

(9)CSRF

跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF,是一种制用户在当前已登录的Web应用程序执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF利用的是网站对用户网页浏览器的信任。

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

从SpringSecurity4.0开始,默认情况下会启用CSRF保护,以防止CSRF攻击应用程序,Spring Security CSRF会针对PATCH,POST,PUT和DELETE方法进行防护。

  1. 微服务权限

什么是微服务

1、微服务由来

微服务最早由Martin Fowler与JamesLewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTPAPI,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。。

2、微服务优势

微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。

微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。

微服务每个模块都可以使用不同的开发技术,开发模式更灵活。

3、微服务本质

微服务,关键其实不仅仅是微服务本身,而是系统要提供一套基础的架构,这种架构使得微服务可以独立的部署、行、升级,不仅如此,这个系统架构还让微服务与微服务之间在结构上“松耦合”,而在功能上则表现为一个统一的整体。这种所谓的“统一的整

体”表现出来的是统一风格的界面,统一的权限管理,统一的安全策略,统一的上线过

程,统一的日志和审计方法,统一的调度方式,统一的访问入口等等。

微服务的目的是有效的拆分应用,实现敏捷开发和部署。

你可能感兴趣的:(Spring,笔记,spring,java)