Spring是非常流行和成功的Java应用开发框架,Spring Security正是Spring家族中的成员。 Spring Security基于Spring框架,提供了一套Web应用安全性的完整解决方案。
Spring Security关于安全方面的两个主要区域是“认证”和“授权”(或者访问控制),一般来说,Web应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是Spring Security重要核心功能。
验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。通俗点说就是系统认为用户是否能登录。
用户授权指的是验证某个用户是否有权限执行某个操作。
在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。通俗点说就是系统判断用户是否有权限去做某些事情。
和Spring 无缝整合
全面的权限控制
专门为Web开发而设计
旧版本不能脱离Web环境使用
新版本对整个框架进行了分层抽取,分成了核心模块和Web模块。单独引入核心模块就可以脱离Web环境。
重量级
一般来说,常见的安全技术栈的组合是这样的:
SSM + Shiro
Spring Boot/Spring Cloud + Spring Security
自从有了Spring Boot 之后,Spring Boot 对于 Spring Security 提供了自动配置方案,可以使用更少的配置来使用Spring Security .
spring-boot-starter 后面加上web
账户默认为user , 密码在启动时会在控制台 输出
Spring Security 本质是一个过滤器链(有很多过滤器)。
重点看三个过滤器:
是一个方法级的权限过滤器,基本位于过滤器链的最底部。
是一个异常过滤器,用来处理在认证授权过程中抛出的异常
对/login的POST请求做拦截,校验表单中用户名,密码
使用Spring Security 配置过滤器
*Delegating Filter Proxy
调用initDelegate 初始化方法
初始化方法initDelegate
执行initDelegate 内置的方法FilterChainProxy
在FilterChainProxy中调用doFilterInternal
List
This.get Filters 方法 把过滤器加载到过滤器中
Get Filters 里面的有个对象 Security Filter Chain
最终返回所有过滤器,把Filter集合加载到过滤链
当什么也没有配置的时候,调用Username Password Authentication Filter
方法,账号和密码是由Spring Security定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的。所以我们要通过自定义逻辑控制认证逻辑。
如果需要自定义逻辑时,只需要实现User Details Service接口即可。
接口定义如下:
创建类继承Username Password Authentication Filter ,重写三个方法。
创建类实现User Detail Service ,编写查询数据过程,返回User对象,这个User对象是安全框架提供对象。
数据加密接口,用于返回User对象里面密码加密。
B Crypt Password Encoder是Spring Security官方推荐的密码解析器。
B Crypt Password Encoder是对b crypt强散列方法的具体实现。是基于Hash算法实现的单向加密。可以通过strength控制加密强度,默认10.
方法演示:
在application.properties 配置文件中 设置账户和密码 :
使用B Crypt Password Encoder 对象调用encode方法对密码进行加密。
启动项目,点击登录会抛出一个异常:
密码加密需要用到Password Encoder 接口,所以在使用时调用 Password Encoder 方法
create table users
(
id int auto_increment
primary key,
username varchar(100) null,
password varchar(100) null
);
在接口中添加@Repository 注解 ,可以解决注入Users Mapper 时 的爆红问题。
如果当前的主体具有指定的权限,则返回true,否则返回false .
只能设置一个用户的访问权限,设置两个会返回403。
第一步和第二步的名称要对应,不然会返回type = Forbidden , status = 403
可设置多个访问用户,有一个对应即可。
如果当前的主体有任何提供的角色(给定的作为一个逗号分隔的字符串列表)的话,返回true.
如果用户具备给定角色就可以访问,否则出现403.
如果当前的主体有指定的角色,则返回true.
功能和has Any Authority 差不多,但是has Role 会在前面加上前缀 ROLE_ .
表示用户具备任何一个条件都可以访问。
使用方法和方法二相同。
用户具有某个角色,可以访问方法。
进入方法前的权限认证,@PreAuthorize可以将登录用户的roles/permissions参数传到方法中。
在方法这些后再进行权限验证,适合验证带有返回值的权限。
表达式中的filterObject引用的是方法返回值List中的某一个元素。
进入控制器之前对数据进行过滤。
创建页面
配置路径
退出之后是无法访问需要登录时才能访问的控制器。
自动登录
cookle技术
安全框架机制实现自动登录
跨站请求伪造(英语: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、微服务由来
微服务最早由Martin Fowler与JamesLewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTPAPI,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。。
2、微服务优势
微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。
微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。
微服务每个模块都可以使用不同的开发技术,开发模式更灵活。
3、微服务本质
微服务,关键其实不仅仅是微服务本身,而是系统要提供一套基础的架构,这种架构使得微服务可以独立的部署、行、升级,不仅如此,这个系统架构还让微服务与微服务之间在结构上“松耦合”,而在功能上则表现为一个统一的整体。这种所谓的“统一的整
体”表现出来的是统一风格的界面,统一的权限管理,统一的安全策略,统一的上线过
程,统一的日志和审计方法,统一的调度方式,统一的访问入口等等。
微服务的目的是有效的拆分应用,实现敏捷开发和部署。