SpringSecurity
Spring Security 是 Spring 家族中的一个安全管理框架,提供了一整套web应用安全性完整
地解决方案,Web应用安全性主要是用户认证和授权,这两个也是SpringSecurity核心功能。
在springboot,springcloud出来之前,权限框架一直是shiro的天下,直到springboot出来后,security才得到广泛地应用。
最合适的推荐组合:
SSM+shiro
springboot+security
SpringSecurity的特点
优点:
与spring无缝结合
全面的权限控制
专为web设计开发(旧版本不能脱离web环境,新版本可以)
缺点:
重量级框架
shiro的特点
优点:
轻量级框架,Apache旗下的
通用性。
缺点:
特定的需求需手动编写
基本原理
security本质是一个过滤器链,内含十几个过滤器。
SpringSecurity 的过滤器:
1.WebAsyncManagerIntegrationFilter:将 Security 上下文与 Spring Web 中用于 处理异步请求映射的 WebAsyncManager 进行集成
2.SecurityContextPersistenceFilter:在每次请求处理之前将该请求相关的安全上 下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将 SecurityContextHolder 中关于这次请求的信息存储到一个“仓储”中,然后将 SecurityContextHolder 中的信息清除,例如在 Session 中维护一个用户的安全信 息就是这个过滤器处理的
3.HeaderWriterFilter:用于将头信息加入响应中
4.CsrfFilter:用于处理跨站请求伪造
5.LogoutFilter:用于处理退出登录
6.UsernamePasswordAuthenticationFilter:用于处理基于表单的登录请求,从表单中 获取用户名和密码。默认情况下处理来自 /login 的请求。从表单中获取用户名和密码 时,默认使用的表单 name 值为 username 和 password,这两个值可以通过设置这个 过滤器的 usernameParameter 和 passwordParameter 两个参数的值进行修改
7.DefaultLoginPageGeneratingFilter:如果没有配置登录页面,那系统初始化时就会 配置这个过滤器,并且用于在需要进行登录时生成一个登录表单页面
8.BasicAuthenticationFilter:检测和处理 http basic 认证
9.RequestCacheAwareFilter:用来处理请求的缓存
10.SecurityContextHolderAwareRequestFilter:主要是包装请求对象 request
11.)AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在 Authentication 对象,如果不存在为其提供一个匿名 Authentication
12.SessionManagementFilter:管理 session 的过滤器
13.ExceptionTranslationFilter:处理 AccessDeniedException 和 AuthenticationException 异常
14.FilterSecurityInterceptor:可以看做过滤器链的出口
15.RememberMeAuthenticationFilter:当用户没有登录而直接访问资源时, 从 cookie 里找出用户的信息, 如果 Spring Security 能够识别出用户提供的 remember me cookie, 用户将不必填写用户名和密码, 而是直接登录进入系统,该过滤器默认不开启
security有两个重要的接口:
UserDetailsService:当什么都没配置时,账号密码是由security自动生成的,实际项目是自定义从数据库查询的,所以我们需要实现此接口
passwordEncoder:把密码按照特定的解析规则进行解析
使用方法
1.UserDetailsServices 接口 自定义逻辑控制认证逻辑
2.WebSecurityConfigurerAdapter类 适配器, 在配置的时候,需要我们自己写个配置类去继承他
3.基于角色或权限进行访问控制
hasAuthority 具有指定的权限,则返回 true,否则返回false
hasAnyAuthority 如果当前有任何提供的角色(给定的作为一个逗号分隔的字符串列表)的话,返回 true.
hasRole 如果用户具备给定角色就允许访问,否则出现403
hasAnyRole 表示用户具备任何一个条件都可以访问
4.自动登录
注入dataSource
方法:PersistentTokenRepository 其中设置数据源DataSource和自动创建表
流程:登录->token存入cookie加密,表中存一份,再次进入将两者对比,true就自动登录
注:前端自动登录name必须为remember-me并在配置类中配置过期时间
CSRF(跨站请求伪造)
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已 登录的 Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个
自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买
商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。 这利用了 web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的 浏览器,却不能保证请求本身是用户自愿发出的。
从 Spring Security 4.0 开始,默认情况下会启用 CSRF保护,以防止 CSRF攻击应用 程序,Spring Security CSRF 会针对 PATCH,POST,PUT 和 DELETE 方法进行防护
注解使用
@EnableGlobalMethodSecurity(securedEnabled=true) 开启注解
@Secured 判断是否具有角色,另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_“
@PreAuthorize 进入方法前的权限验证(需先开启注解@EnableGlobalMethodSecurity(prePostEnabled = true) )
@PostAuthorize 进入方法后的权限验证(需先开启注解@EnableGlobalMethodSecurity(prePostEnabled = true) )
@PostFilter 权限验证之后对数据进行过滤 留下用户名的数据
@PreFilter 进入控制器之前对数据进行过滤
SpringSecurity 微服务权限方案
1.编写核心配置类
是继承 WebSecurityConfigurerAdapter 并注解 @EnableWebSecurity 的配置。这个配置指明了用户名密码的处理方式、请求路径、登录 登出控制等和安全相关的配置
2.创建认证授权相关的工具类
PasswordEncoder 密码处理接口
TokenManager token 操作的工具(结合JWT)
LogoutHandler 退出接口
AuthenticationEntryPoint 未授权统一处理 接口
3.创建认证授权实体类
UserDetails 登录用户和权限接口
User 用户实体类
4.创建认证和授权的filter
UsernamePasswordAuthenticationFilter 用户密码过滤器类
BasicAuthenticationFilter 授权过滤器类