[toc]
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 的入门案例
基本步骤
创建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>
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>
创建用于演示的页面,
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>
添加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
出现问题解决
出现
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仓库共享]
作者:weir_will
链接:https://www.jianshu.com/p/321f3ec0765f
共同学习,写下你的评论
评论加载中...
作者其他优质文章