一. 权限系统概述
1. 为什么需要权限系统?
安全性: 误操作, 人为破坏, 数据泄露等.
数据隔离: 不同的权限能看到及操作不同的数据.
明确职责: 运营, 客服等不同角色, leader 和 dev 等不同级别
2. 权限管理核心
用户 -- 权限: 人员少, 功能固定, 或者特别简单的系统
RBAC(Role-Based Accecc Control): 用户 - 角色 - 权限 - 控制, 基于角色的访问控制
3. 理想中的权限管理
能实现角色级别权限: RBAC
能实现功能级, 数据级权限
简单, 易操作, 能够应对各种需求
4. 相关操作界面
权限管理界面, 角色管理界面, 用户管理界面
角色和权限关系维护界面, 用户和角色管理维护界面
二. Spring Security 权限框架学习
1.Spring Security 介绍
几种认证方式
Basic: 认证方式 (质询 / 响应的方式(challenge/response)) 通过客户端输入账号密码, 账号密码以 Basic64 加密方式放在请求头中发送到 web 服务器访问相应资源.
缺点:1无状态导致每次通信都要带上认证信息, 即使是已经认证过的资源;
缺点:2传输安全性不足, 认证信息用 Base64 编码, 基本就是明文传输, 很容易对报文截取并盗用认证信息.
Digest: 认证方式: 质询 / 响应的方式(challenge/response).
过程: 用户输入用户名和密码, 浏览器对用户名, 密码, nonce 值, HTTP 请求方法, 被请求资源 URI 等组合后进行 MD5 运算, 把计算得到的摘要信息添加到请求头发送给服务端.
相比 Basic: 使用了随机字符串, 避免了密码在网络上明文传输,
缺点: 认证报文被攻击者拦截到攻击者可以获取到资源. DIGEST 认证提供了高于 BASIC 认证的安全等级, 但是和 HTTPS 的客户端认证相比仍旧很弱.
X.509
LDAP
2.SpringSecurity 过滤器链
SpringSecurity 采用的是责任链的设计模式, 它有一条很长的过滤器链. 现在对这条过滤器链的各个进行说明:
WebAsyncManagerIntegrationFilter: 将 Security 上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成.
SecurityContextPersistenceFilter: 在每次请求处理之前将该请求相关的安全上下文信息加载到 SecurityContextHolder 中, 然后在该次请求处理完成之后, 将 SecurityContextHolder 中关于这次请求的信息存储到一个 "仓储" 中, 然后将 SecurityContextHolder 中的信息清除, 例如在 Session 中维护一个用户的安全信息就是这个过滤器处理的.
HeaderWriterFilter: 用于将头信息加入响应中.
CsrfFilter: 用于处理跨站请求伪造.
LogoutFilter: 用于处理退出登录.
UsernamePasswordAuthenticationFilter: 用于处理基于表单的登录请求, 从表单中获取用户名和密码. 默认情况下处理来自 /login 的请求. 从表单中获取用户名和密码时, 默认使用的表单 name 值为 username 和 password, 这两个值可以通过设置这个过滤器的 usernameParameter 和 passwordParameter 两个参数的值进行修改.
DefaultLoginPageGeneratingFilter: 如果没有配置登录页面, 那系统初始化时就会配置这个过滤器, 并且用于在需要进行登录时生成一个登录表单页面.
BasicAuthenticationFilter: 检测和处理 http basic 认证.
RequestCacheAwareFilter: 用来处理请求的缓存.
SecurityContextHolderAwareRequestFilter: 主要是包装请求对象 request.
AnonymousAuthenticationFilter: 检测 SecurityContextHolder 中是否存在 Authentication 对象, 如果不存在为其提供一个匿名 Authentication.
SessionManagementFilter: 管理 session 的过滤器
ExceptionTranslationFilter: 处理 AccessDeniedException 和 AuthenticationException 异常.
FilterSecurityInterceptor: 可以看做过滤器链的出口.
RememberMeAuthenticationFilter: 当用户没有登录而直接访问资源时, 从 cookie 里找出用户的信息, 如果 Spring Security 能够识别出用户提供的 remember me cookie, 用户将不必填写用户名和密码, 而是直接登录进入系统, 该过滤器默认不开启.
3.SpringSecurity 流程图
流程说明
客户端发起一个请求, 进入 Security 过滤器链.
当到 LogoutFilter 的时候判断是否是登出路径, 如果是登出路径则到 logoutHandler , 如果登出成功则到 logoutSuccessHandler 登出成功处理, 如果登出失败则由 ExceptionTranslationFilter ; 如果不是登出路径则直接进入下一个过滤器.
当到 UsernamePasswordAuthenticationFilter 的时候判断是否为登录路径, 如果是, 则进入该过滤器进行登录操作, 如果登录失败则到 AuthenticationFailureHandler 登录失败处理器处理, 如果登录成功则到 AuthenticationSuccessHandler 登录成功处理器处理, 如果不是登录请求则不进入该过滤器.
当到 FilterSecurityInterceptor 的时候会拿到 uri , 根据 uri 去找对应的鉴权管理器, 鉴权管理器做鉴权工作, 鉴权成功则到 Controller 层否则到 AccessDeniedHandler 鉴权失败处理器处理.
spring security 优缺点
优点:
提供了一套安全框架, 而且这个框架是可用的
提供了很多用户认证的功能, 实现相关接口即可, 节约大量开发工作
基于 spring, 易于集成到 spring 项目中, 且封装了很多方法.
来源: http://www.bubuko.com/infodetail-3399193.html