Spring Security简介及设置方法
在本教程中,我们将学习如何使用springsecurity保护web应用程序,包括用户身份验证、授权等。
Spring安全-简介
springsecurity是一个可定制的身份验证框架。它是保护基于Spring的应用程序的标准。它提供身份验证和授权。授权也被称为“访问控制”。
Spring安全的核心构件
*SecurityContextHolder:*将当前SecurityContext与当前执行线程关联。它保存当前与应用程序交互的SecurityContext的信息。安全上下文信息存储在一个 ThreadLocal对象中,该对象对当前线程中运行的所有成员都可用。
SecurityContext:定义与当前执行线程关联的最低安全信息的接口。换句话说,它持有Authentication对象并请求特定的安全信息。
*身份验证:*表示身份验证请求所需的令牌。一旦请求经过身份验证,令牌通常存储在SecurityContextHolder管理的线程本地SecurityContext中。在用户身份验证之后,使用UserDetails对象构建身份验证对象,然后将其存储在SecurityContextHolder中。
*UserDetails:*提供有关用户的核心信息。
*UserDetailsService:*加载特定的用户数据。它是一个允许从数据库加载用户相关信息的接口。该接口只需要一个只读方法,简化了对新数据访问策略的支持。
*GrantedAuthority:*通常由UserDetailsService加载。表示授予身份验证对象的权限。
认证
身份验证(如前所述)表示与应用程序交互的主要信息(用户、设备、外部系统等)。在处理用户身份验证时,从传入的请求中检索用户名和密码,然后将其作为UsernamePasswordAuthenticationToken的实例。然后将该令牌传递给AuthenticationManager,后者根据数据库中的主体标识验证主体标识。如果身份验证成功,AuthenticationManager将返回一个存储主体详细信息的authentication对象。最后,在SecurityContextHolder方法的帮助下,身份验证对象被填充到安全上下文中。
让我们看看AuthenticationManager接口是什么样子的:
public interface AuthenticationManager { Authentication authenticate(Authentication authentication) throws AuthenticationException; }
如我们所见,它只有一个方法。然而,这一方法可以用来完成三件事:
返回身份验证(请参阅上面的文本)
引发AuthenticationException
返回空
AuthenticationManager通常为ProviderManager提供一个实现,然后由它委托给一系列AuthenticationProvider实例。AuthenticationProvider与AuthenticationManager非常相似,只是它多了一个方法:
public interface AuthenticationProvider { Authentication authenticate(Authentication authentication) throws AuthenticationException; boolean supports(Class<?> authentication); }
授权
授权的任务是决定是否允许用户访问给定的资源,换句话说,他是否有权限。在这个阶段,Spring为我们提供了一个名为AccessDecisionManager.的Authorization组件,它帮助我们提供了一个API。
多亏了AOP,我们可以实现授权。AOP决定是否允许调用方法的用户调用方法。
如何在Spring应用中设置Spring安全性
在Mavenpom.xml文件文件,粘贴以下内容:
<dependencies> <dependency> <groupId>org.springframework.security</groupId> <artifcatId>spring-security-web</artifactId> <version>4.2.3</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>4.2.3</version> </dependency> </dependencies>