springsecurity,如何在Maven中配置Spring Security依赖
各位老铁们,大家好,今天由我来为大家分享springsecurity,以及如何在Maven中配置Spring Security依赖的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
如何在Maven中配置Spring Security依赖
1.1 spring-security-core
Spring Security的核心功能是由spring-security-core包提供的,包含了认证和访问控制功能、支持standalone应用程序、方法级安全和JDBC支持。
<properties>
<org.springframework.security.version>3.2.3.RELEASE</org.springframework.security.version>
<org.springframework.version>4.0.4.RELEASE</org.springframework.version>
</properties>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${org.springframework.security.version}</version>
</dependency>
注意:我们使用的是3.2.x版本的Spring Security--Spring和Spring Security有着不同的版本计划,所以他们的版本号之间没有一对一关系。
如果项目使用的是较老版本的Spring,需要注意的时Spring Security 3.1.x版本不依赖于Spring 3.1.x版本,因为Spring Security 3.1.x版本在Spring 3.1之前发布。Spring的计划是在后续的版本中,使双方的版本号更为接近,更多细节请查看这个JIRA。我们将在后面的内容中看看这种情况对我们的实际影响。
1.2 spring-security-web
要为Spring Security增加Web支持,需要引入spring-security-web依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${org.springframework.security.version}</version>
</dependency>
这个项目为Servlet环境引入了针对URL访问控制的相关基础安全组件和过滤器。
1.3 Spring Security与较老版本的Spring Core之间的依赖问题
如上文所述,这个新的依赖产生一个Maven依赖关系问题,Spring Security的相关jar不依赖于最新的Spring core的jar(而是以前的版本)。这可能使的被依赖的Spring core相关包在类路径中被配置前在最新的Spring 4.x相关包的前面。
这是如何发生的呢?我们需要了解Maven处理版本冲突的机制,Maven会选择与依赖树树根最接近的版本。在之前的情况中,spring-orm依赖4.x版本的spring-core,而spring-security-core依赖于3.2.8版本的spring-core。因此,spring-orm和sprint-security-web的定义顺序就是一个问题,先定义的会有更高的优先级。最终情况就是,我们的类路径中会有两个版本的spring-core。
为了避免这类问题,我们需要在我们的pom文件中明确指定一些Spring依赖,而不依靠Maven隐式依赖机制。我们将在pom的根文件中定义特定的依赖关系,这样这些依赖关系将会有更高的优先级。下面例子中,将对所有的Spring核心组件明确定义相同的版本,对于多模块项目,需要在父配置文件的dependencyManagement属性中定义。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
1.4 spring-security-config及其他
要使用丰富的Spring Security XML的命名空间,需要定义spring-security-config依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${org.springframework.security.version}</version>
<scope>runtime</scope>
</dependency>
没有任何代码需要在编译时依赖这个包,所以它的范围应该定义为runtime。
最后,LDAP、ACL、CAS和OpenID支持需要分别增加各自的依赖包:spring-security-ldap, spring-security-acl, spring-security-cas和spring-security-openid。
Spring Security源码(一):认证、授权、过滤器链
因为看了很多博客,发现很多人的使用风格都不一样,有点懵。感觉最好的方法就是多看一些源码,然后自己选择想要的使用方式。
spring security版本:2.1.6.RELEASE
这里先讲这三种的关系
AuthenticationManager、ProviderManager、AuthenticationProvider
封装了用户身份信息
一个接口,只有一个方法
ProviderManager是AuthenticationManager的实现类,提供了基本认证实现逻辑和流程;
先看这个方法这个方法,是用来认证的方法
关键点
AuthenticationProvider本身也就是一个接口,它有实现类 AbstractUserDetailsAuthenticationProvider和AbstractUserDetailsAuthenticationProvider的子类DaoAuthenticationProvider
只有两个方法
这是一个抽象类,是模板模式。定义好了认证流程,我们去实现流程中的一些环节方法。达到了自定义认证的效果
AbstractUserDetailsAuthenticationProvider的子类,实现了一些抽象方法
retrieveUser
主要就是用 UserDetailsService去查找用户
additionalAuthenticationChecks
createSuccessAuthentication
本质还是调用了父类的方法,就是新建了一个Authentication,然后将 UserDetails的信息传递过去
UserDetailsService是一个接口,提供了一个方法
感觉这个接口没什么用,就是用来管理用户类的
SS在http后台中起作用主要是基于 Servlet Filters的,我们先来看看什么是 Filter是如何作用在 Servlet中的。
springSecurityFilterChain是个接口, DefaultSecurityFilterChain是它的实现类,而DefaultSecurityFilterChain内部存在这一个 Filters列表,关于SS中的过滤器和他们的执行顺序(Order)可以查看官方文档,当我们需要自定义Filter的时候就会用到。当请求到来时,在 ss里边的 Filter就会作用请求,如下图:
在上面我们说到了SS有自己的一条过滤器链,下面就是截图:(执行顺序就是集合中的顺序)
下面说一下几个比较重要的 Filter的处理逻辑
整个调用流程是,先调用其父类 AbstractAuthenticationProcessingFilter.doFilter()方法,然后再执行 UsernamePasswordAuthenticationFilter.attemptAuthentication()方法进行验证;
父类是 AbstractAuthenticationProcessingFilter(又是模板模式,子类实现抽象方法,父类定好流程)
requiresAuthentication
判断是否需要当前filter处理,就是判断路径、请求方法等等
以UsernamePasswordAuthenticationFilter的构造方法为例
successfulAuthentication
这里的认证就是第一节的内容( this.getAuthenticationManager().authenticate(authRequest))
从上图中过滤器的执行顺序图中可以看出 AnonymousAuthenticationFilter过滤器是在UsernamePasswordAuthenticationFilter等过滤器之后,如果它前面的过滤器都没有认证成功,Spring Security则为当前的SecurityContextHolder中添加一个Authenticaiton的匿名实现类 AnonymousAuthenticationToken;
ExceptionTranslationFilter异常处理过滤器,该过滤器用来处理在系统证授权过程中抛出的异常(也就是下一个过滤器FilterSecurityInterceptor),主要是处理 AuthenticationException和 AccessDeniedException。
此过滤器为认证授权过滤器链中最后一个过滤器,该过滤器之后就是请求真正的/xx服务
Spring Security默认使用 AffirmativeBased实现 AccessDecisionManager的 decide方法来实现授权
到此位置 authentication当前用户信息,fl当前访问的资源路径及attributes当前资源路径的决策(即是否需要认证)。剩下就是判断当前用户的角色Authentication.authorites是否权限访问决策访问当前资源fi
Spring Security核心过滤器链分析
SpringSecurity认证流程分析
要想分析SpringSecurity的认证流程,就一定要先了解整个SpringSecurity的工作流程,我们才能最终进行一些自定义操作。
Spring Security的web基础是Filters(过滤器),它是通过一层层的Filters来对web请求做处理的,每一个web请求会经过一条过滤器链,在这个过程中完成认证与授权。
其具体工作流程是这样的:
有了以上的一些基础了解后,我们来顺着源码流程走一边,理清整个认证的流程。
基于formLogin的流程分析,SpringSecurity默认也是formLogin。
以下源码我都将注释去掉,否则太长了!
【项目实践】一文带你搞定前后端分离下的认证和授权|Spring Security+ JWT
SpringSecurity+JWT认证流程解析|掘金新人第一弹
SpringSecurit(小胖哥)
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!