• Spring Security系列(一)简介


    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,是Spring应用程序的标准安全框架。

    1.安全

    安全是一个不断移动的目标,采取一个全面的全系统的方法很重要。在安全领域,我们鼓励你采取"layers of security"(安全层),这样每一层尽可能的在自己范围内诶保证安全,连续的层提供额外的安全性。安全层更密集你的程序将更加健壮更加安全。

    ①应用之外的安全机制:如防火墙,VPN等

    在企业环境中你可以部署一个DMZ将面向公众的服务器和数据库以及应用服务器分隔开来。

    ②应用本身的安全机制:如Sql注入,XSS,逻辑漏洞等

    这个层面的安全问题,在程序开发时是可以通过编程解决大部分,项目中使用安全框架,提高单元测试的代码覆盖率。

    ③应用底层的安全机制:编程语言和技术漏洞等

    这个层面的问题自然有更专业的安全专家解决,而且对于java而言自身的安全机制也是很强的。

    显然开发人员能够控制的就是应用本身的安全问题,学习常见的Web安全问题和安全框架是每一位开发人员所必须的技能。

    2.认证(Authentication)和授权(Authorization)

    在学习框架之前,我们先要搞清楚两个核心概念:认证和授权

    ①认证简单的来讲就是校验身份信息,确定用户身份是否有效

    例如使用传统的账号密码校验(类似于appId和密钥)和使用session和token校验等。

    说到账号密码校验,就不得不提数据加密的问题,为了确保安全性通常涉及隐私的都是密文存储,尽管使用hash函数得到的摘要密文是不可逆的,但是目前常用的md5,sha256都可以通过查询彩虹表(Rainbow Tables)暴力破解,因此通过加盐来进一步提高密码的复杂度。

    ②授权简单的来讲就是校验权限,确定有效用户是否有权限访问资源

    认证和授权也是RBAC模型的核心部分(学习框架了解RBAC还是很有必要的,Spring Security和Apache Shiro都是基于RBAC模型的安全框架)。

    3.Spring Security 能做什么

    ①综合对认证授权的支持,并且可扩展

    ②保护常见的攻击:session fixation, clickjacking, cross site request forgery等

    ③支持ServletAPI,Spring Web MVC等

    SpringSecurity包含以下部分:

    spring-security-core.jar 认证授权的核心模块

    spring-security-remoting.jar 整合了Spring Remoting,创建远程客户端时使用

    spring-security-web.jar 过滤器和web安全,支持servlet

    spring-security-config.jar

    spring-security-ldap.jar

    spring-security-oauth2-core.jar和spring-security-oauth2-client.jar等

    4.PasswordEncoder

    PasswordEncoder接口定义了密码加密的顶级接口,老版本的默认加密方式是NoOpPasswordEncoder(默认不加密),而Spring Security 5.0后的默认加密方式为BCryptPasswordEncoder。

    Spring Security提供了DelegatingPasswordEncoder(通过PasswordEncoderFactories类创建,也可以模仿PasswordEncoderFactories类自定义) 兼容老版本。

    目前Spring Security中建议使用上述四种加密算法,其他算法认为不安全。

    5.架构/原理

    首先SpringSecurity是基于Filter技术实现的。Spring通过DelegatingFilterProxy建立Web容器和Spring ApplicationContext的联系而SpringSecurity使用FilterChainProxy 注册SecurityFilterChain。

     

     重点研究Spring Security中定义的各种Filter以及执行顺序。

     ①认证模块

     a.SecurityContextHolder(用于存储授权信息)

    手动授权的例子(SecurityContextHolder.getContext().setAuthentication(authentication)这种授权方式多线程不安全):

    SecurityContext context = SecurityContextHolder.createEmptyContext(); 
    Authentication authentication =
        new TestingAuthenticationToken("username", "password", "ROLE_USER"); 
    context.setAuthentication(authentication);
    SecurityContextHolder.setContext(context); 

    b.AuthenticationManager

    除了手动授权外,SpringSecurity通过AuthenticationManager和ProviderManager进行授权。其中AuthenticationProvider代表不同的认证机制(最常用的账号/密码)。

     ②授权模块

    认证完成之后,SpringSecurity通过AccessDecisionManager 完成授权操作。除了全局的授权配置之外,也可以通过@PreAuthorize@PreFilter@PostAuthorize , @PostFilter注解实现方法级别的权限控制。

    授权的表达式: 

    6.使用介绍

    ①基于用户名和密码的认证模式

    请求的用户名密码可以通过表单登录,基础认证,数字认证三种方式从HttpServletRequest中获得,用于认证的数据源策略有内存,数据库,ldap,自定义等。

     

     上面两图描述了表单登录的过程,拦截未授权的请求,重定向到登录页面,进行账号密码认证。

    7.简单总结

    SpringSecurity核心是认证和授权,是基于Filter实现的。

  • 相关阅读:
    O2O创业团队,遇到生死悠关的问题,希望大家支招?
    你所忽视的“办公室政治”
    Mac OS X下给树莓派安装Raspbian系统
    树莓派上的软件安装和卸载命令汇总
    树莓派实现PPPOE拨号上网
    VNC远程登录树莓派的图形界面 -- VNC Server安装与连接
    树莓派玩家必装的几个Android手机APP
    没有鼠标,没有键盘,没有显示器,没有网络,仅通过串口连接控制树莓派
    树莓派2代B型性能极限测试
    朋友分享的设计网站鉴赏 记录
  • 原文地址:https://www.cnblogs.com/masting/p/12820343.html
Copyright © 2020-2023  润新知