zoukankan      html  css  js  c++  java
  • 01-Spring Security框架学习

    01-Spring Security框架学习

    简介

    Spring Security 是什么

    Spring Security 为基于 Java EE 的企业应用提供综合的安全服务。尤其支持使用Spring Framework构建的项目,这是目前企业软件开发的流行的Java EE解决方案。

    Spring Security 解决那些问题

    Java EE Servlet 规范或 EJB 规范的安全特性在典型的企业应用场景中缺乏深度;在系统环境中做大量的重复配置工作(例:判断用户是否登录,是否具备管理员的权限等)。

    一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。这些概念非常通用,它们并不是 Spring Security 的特性。

    Spring Security 的优点

    认证级别

    在认证级别,Spring Security 支持范围广泛的认证模型。大多数认证模型由第三方提供,或由相关标准制定组织(如 IETF)研制,同时Spring Security 提供它自己的认证功能。

    • HTTP BASIC headers认证 (基于IETF RFC标准)
    • HTTP Digest headers认证 (基于IETF RFC标准)
    • HTTP X.509 客户端证书交换 (基于IETF RFC标准)
    • LDAP (一种非常常见的跨平台认证需求,在大环境下尤甚)
    • 基于表单的认证 (通常用于简单的用户需求)
    • OpenID认证
    • 基于预定义的请求头进行认证 (诸如计算机集群)
    • JA-SIG 中央认证服务 (也称为CAS, 是一种流行的开源的单点登陆系统)
    • 为RMI 和 HttpInvoker(一种Spring远程协议)提供对用户透明的认证机制
    • 自动的 "remember-me" 认证 (你可以勾选此选项,从而避免在一定时间内进行重复认证)
    • 匿名认证 (为每个未经认证的用户提供一个特殊的安全身份)
    • Run-as 认证 (同一个调用需要进行不同的安全校验时非常有用)
    • Java认证与认证服务 - Java Authentication and Authorization Service (JAAS)
    • JEE
    • 认证 (如果你需要,你仍然可以使用容器托管
    • 认证)
    • Kerberos
    • Java开源单点登陆 - Java Open Source Single Sign On (JOSSO) *
    • OpenNMS网络管理平台 - OpenNMS Network Management Platform *
    • AppFuse *
    • AndroMDA *
    • Mule ESB *
    • Direct Web Request (DWR) *
    • Grails *
    • Tapestry *
    • JTrac *
    • Jasypt *
    • Roller *
    • Elastic Path *
    • Atlassian Crowd *
    • 你自己的权限系统 (参见后续内容)

      带*表示由第三方提供

    授权功能

    Spring Security允许对授权功能进行深度设置。它关注于三个主要方面:web请求授权、方法调用授权以及域对象实例访问授权

    历史背景

    • 2004年1月,已经大约有20人在使用此代码。这些首批用户开始建议将其作为一个SourceForge项目,于是项目于2004年3月正式成立。
    • 2006年5月,1.0.0 final release版本正式发布
    • 2007年年末的时候,正式成为Spring Portfolio官方项目,并更名为"Spring Security"。
      ...

    Spring Security版本编号 MAJOR.MINOR.PATCH(主版本.小版本.补丁)

    • MAJOR的变更意味着大规模的API的更新,因此很多地方都不会兼容旧版本。
    • MINOR的变更尽可能保持源码和编译文件的兼容性,尽管可能有一些设计上的变更或者不兼容的更新。
    • PATCH通常完全向前向后兼容,主要用于修复一些bug与缺陷。

    Spring Security 的入门案例

    基本步骤

    1. 创建Maven的web项目,在pom.xml中导入依赖入下
    <!-- spring-security 的依赖 -->
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-config</artifactId>
      <version>${spring.version}</version>
    </dependency>
    
    1. web.xml 配置过滤器
    <!-- 通过 ContextLoaderListener 定义 spring context 容器的xml文件的位置 -->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/*.xml
    </param-value>
    </context-param>
    
    <!-- springSecurity 指定的过滤器:springSecurityFilterChain(该过滤链过滤所有的连接) -->
    <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!-- web容器(监听器)启动加载容器上下文-->
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    1. 创建用于演示的页面,src/main/webapp/index.html
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    spring-security,hello world!
    欢迎来到,spring-security的世界!
    </body>
    </html>
    
    1. 添加Spring Security 的配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/security"
        xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security.xsd">
      
      <!-- 页面的链接规则 -->     
      <http use-expressions="false">
        <intercept-url pattern="/**" access="ROLE_ADMIN"/>
        <!-- 开启表单提交功能 -->
        <form-login/>
      </http>
      <!-- 认证管理器 -->
      <authentication-manager>
        <authentication-provider>
          <user-service>
            <user name="admin" password="admin" authorities="ROLE_ADMIN"/>
          </user-service>
        </authentication-provider>
      </authentication-manager>
    </beans:beans>
    

    注意:该文件是本案例的重点,基本内容使用注释。

    • 把security的头信息的配置作为了默认配置,那么以后在进行编写security的相关配置的时候就不需要security:xxx前缀。

    运行效果

    image

    出现问题解决

    1. 出现java.lang.NoSuchMethodError: org.springframework.util.AntPathMatcher.setCaseSensitive(Z)V的错误,如下详细错误信息

      Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.DefaultSecurityFilterChain#0': Cannot resolve reference to bean 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0' while setting constructor argument with key [4]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter]: Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.util.AntPathMatcher.setCaseSensitive(Z)V
      	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
      	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
      	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:382)
      	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:157)
      	at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:637)
      	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:140)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1131)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1034)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
      	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
      	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
      	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
      	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
      	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
      	... 26 more
      Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter]: Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.util.AntPathMatcher.setCaseSensitive(Z)V
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1093)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1038)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
      	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
      	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
      	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
      	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
      	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
      	... 40 more
      Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter]: Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.util.AntPathMatcher.setCaseSensitive(Z)V
      	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163)
      	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
      	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1086)
      	... 48 more
      Caused by: java.lang.NoSuchMethodError: org.springframework.util.AntPathMatcher.setCaseSensitive(Z)V
      	at org.springframework.security.web.util.matcher.AntPathRequestMatcher$SpringAntMatcher.createMatcher(AntPathRequestMatcher.java:268)
      	at org.springframework.security.web.util.matcher.AntPathRequestMatcher$SpringAntMatcher.<init>(AntPathRequestMatcher.java:252)
      	at org.springframework.security.web.util.matcher.AntPathRequestMatcher$SpringAntMatcher.<init>(AntPathRequestMatcher.java:245)
      	at org.springframework.security.web.util.matcher.AntPathRequestMatcher.<init>(AntPathRequestMatcher.java:116)
      	at org.springframework.security.web.util.matcher.AntPathRequestMatcher.<init>(AntPathRequestMatcher.java:84)
      	at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.<init>(UsernamePasswordAuthenticationFilter.java:62)
      	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
      	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
      	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
      	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
      	... 50 more
      

      问题原因分析:

      由于AntPathMatcher的类的方法在setCaseSensitive()在Spring-core 4.1.X 中不存在导致.
      参考答案:

      1. ontext-initialization-failed-nosuchmethoderror-antpathmatcher-setcasesensiti

      问题解决方式

      修改Spring和Spring Security的版本到4.2.3.RELEASE

    项目

    [项目刚刚开始,后期上传至Git仓库共享]


    参考资料

  • 相关阅读:
    Python--网络编程
    Linux-安装Windows字体
    计算机网络基础
    Cobalt Strike之CHM、LNK、HTA钓鱼
    Python之——python-nmap的安装与常用方法说明
    Python之单例模式的多种实现
    Cobalt Strike之信息收集、木马钓鱼
    Ubuntu 16.04安装Java 8
    代码审计-MetInfo 6.0.0 sql注入漏洞
    代码审计-凡诺CMS 2.1文件包含漏洞
  • 原文地址:https://www.cnblogs.com/weir110/p/9411050.html
Copyright © 2011-2022 走看看