(一)Spring Security
Spring Security是一个灵活和强大的身份验证和访问控制框架,以确保基于Spring的Java Web应用程序的安全。
Spring Security是一个重量级的安全框架,它确保基于Spring的应用程序提供身份验证和授权支持。它与Spring MVC有很好地集成,并配备了流行的安全算法实现捆绑在一起。
Spring Security 主要实现了Authentication(认证,解决who are you? ) 和 Access Control(访问控制,也就是what are you allowed to do?,也称为Authorization)。Spring Security在架构上将认证与授权分离,并提供了扩展点。“认证”是为用户建立一个其声明的角色的过程,这个角色可以一个用户、一个设备或者一个系统。“验证”指的是一个用户在你的应用中能够执行某个操作。在到达授权判断之前,角色已经在身份认证过程中建立了。
特点
Shiro能实现的,Spring Security 基本都能实现,依赖于Spring体系,但是好处是Spring全家桶的一员,集成上更加契合,在使用上,比Shiro略功能强大(但是一般Shiro够用)
(二)Shiro 和 Spring Security区别
1、Shiro比Spring Security更容易使用,也就是实现上简单一些,同时基本的授权认证Shiro也基本够用
2、Spring Security社区支持度更高(但是安装Spring Security很难),Spring社区支持力度和更新维护上有优势,同时和Spring这一套的结合较好
3、Shiro 功能强大、且 简单、灵活。是Apache 下的项目比较可靠,且不跟任何的框架或者容器绑定,可以独立运行
1、spring security所谓的全局上下文是如何实现的?
ThreadLocal
2、了解spring security哪些核心组件,并介绍?
AuthenticationManagerBuilder
想要在WebSecurityConfigurerAdapter中进行认证相关的配置,可以使用configure(AuthenticationManagerBuilder auth)暴露一个AuthenticationManager的建造器:AuthenticationManagerBuilder 。
SecurityContextHolder
SecurityContextHolder用于存储安全上下文(security context)的信息。
Authentication
<1> Authentication是spring security包中的接口,直接继承自Principal类,而Principal是位于java.security包中的。可以见得,Authentication在spring security中是最高级别的身份/认证的抽象。
<2>由这个顶级接口,我们可以得到用户拥有的权限信息列表,密码,用户细节信息,用户身份信息,认证信息。
AuthenticationManager
AuthenticationManager(接口)是认证相关的核心接口,也是发起认证的出发点,因为在实际需求中,我们可能会允许用户使用用户名+密码登录,同时允许用户使用邮箱+密码,手机号码+密码登录,甚至,可能允许用户使用指纹登录(还有这样的操作?没想到吧),所以说AuthenticationManager一般不直接认证,AuthenticationManager接口的常用实现类ProviderManager 内部会维护一个List列表,存放多种认证方式,实际上这是委托者模式的应用(Delegate)。
UserDetails与UserDetailsService
UserDetails这个接口,它代表了最详细的用户信息,这个接口涵盖了一些必要的用户信息字段,具体的实现类对它进行了扩展。
UserDetailsService和AuthenticationProvider两者的职责常常被人们搞混,关于他们的问题在文档的FAQ和issues中屡见不鲜。记住一点即可,敲黑板!!!UserDetailsService只负责从特定的地方(通常是数据库)加载用户信息,仅此而已,记住这一点,可以避免走很多弯路。
DaoAuthenticationProvider
AuthenticationProvider最最最常用的一个实现便是DaoAuthenticationProvider。顾名思义,Dao正是数据访问层的缩写,也暗示了这个身份认证器的实现思路。
Spring Security 是 Spring 框架的一个模块,用于处理应用程序的安全性需求,包括身份验证(Authentication)和授权(Authorization)。它提供了一套强大且可扩展的安全性功能,用于保护应用程序的资源和数据。下面是关于 Spring Security 的理解以及在面试中可能会遇到的问题和回答:
Spring Security 的理解:
-
安全性管理:Spring Security 提供了全面的安全性管理功能,包括身份验证、授权、会话管理、密码加密、跨站点请求伪造(CSRF)防护等。
-
集成性:它可以轻松集成到 Spring 应用程序中,并与其他 Spring 模块(如 Spring Boot、Spring MVC)协同工作。
-
自定义性:Spring Security 允许开发人员根据应用程序的需求进行高度自定义,包括自定义身份验证提供程序、访问控制规则、用户存储和用户界面。
-
细粒度控制:开发人员可以通过配置和编程方式定义谁可以访问应用程序的哪些资源,并对不同的用户或角色设置不同的权限。
-
跨域资源共享(CORS)支持:Spring Security 提供了对 CORS 的支持,允许你安全地处理跨域请求。
-
单点登录(SSO):Spring Security 可以与单点登录解决方案集成,以实现用户在多个应用程序之间的单一身份验证。
可能在面试中遇到的问题和回答:
-
什么是身份验证和授权?Spring Security 如何支持这两个概念?
- 身份验证是确定用户是谁的过程,通常涉及用户名和密码的验证。Spring Security支持多种身份验证机制,包括基于表单、HTTP基本认证、LDAP等。
- 授权是确定用户是否有权执行某个操作或访问某个资源的过程。Spring Security通过配置访问控制规则和角色来支持授权。
-
Spring Security 如何处理会话管理?
- Spring Security可以配置会话管理策略,如最大会话数、会话过期时间等,以确保会话的安全性。
-
什么是 CSRF 攻击?Spring Security 如何防止 CSRF 攻击?
- CSRF(Cross-Site Request Forgery)攻击是一种利用用户已登录的身份来执行未经授权的操作的攻击方式。Spring Security通过生成和验证CSRF令牌来防止这种攻击。
-
如何配置Spring Security?可以演示一个简单的配置示例吗?
- Spring Security的配置通常在应用程序的配置类中完成,包括定义身份验证提供程序、授权规则和访问控制等。示例可以包括使用
@EnableWebSecurity
注解的配置类。
- Spring Security的配置通常在应用程序的配置类中完成,包括定义身份验证提供程序、授权规则和访问控制等。示例可以包括使用
-
Spring Security 支持哪些身份验证提供程序?
- Spring Security支持多种身份验证提供程序,包括基于数据库的身份验证、LDAP、OAuth、OpenID等。开发人员可以选择合适的提供程序来满足应用程序的需求。
-
Spring Security 和 OAuth2 之间有什么关系?
- Spring Security OAuth是Spring Security的一个扩展,用于实现OAuth2协议,以支持身份验证和授权。它使应用程序可以作为OAuth2提供者或客户端进行身份验证和授权。
-
如何处理用户的密码安全?Spring Security 提供了哪些密码加密机制?
- Spring Security提供了多种密码加密机制,包括BCrypt、SHA-256等。开发人员可以使用这些机制来加密和验证用户的密码,以提高安全性。
-
如何实现单点登录(SSO)?Spring Security 可以用于实现SSO吗?
- Spring Security可以与单点登录解决方案集成,如Spring Security OAuth或Spring Security SAML,以实现用户在多个应用程序之间的单一身份验证。
这些问题和回答可以帮助你准备面试时关于Spring Security的问题。在面试中,还可能会深入探讨Spring Security的高级主题,如自定义过滤器、监听器、自定义用户详细信息服务等,具体取决于面试官的要求和你的经验水平。因此,在准备面试时,建议深入学习Spring Security的相关知识。
以下是一个简单的Spring Security配置示例,将演示如何使用Spring Security来保护Web应用程序中的资源,包括定义用户、配置身份验证和授权规则等。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// 配置内存中的用户,用于身份验证
auth
.inMemoryAuthentication()
.withUser("user1").password("{noop}password1").roles("USER")
.and()
.withUser("admin").password("{noop}adminpassword").roles("USER", "ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll() // 允许所有用户访问公共资源
.antMatchers("/admin/**").hasRole("ADMIN") // 仅允许拥有ADMIN角色的用户访问/admin/**
.anyRequest().authenticated() // 其他请求需要身份验证
.and()
.formLogin() // 启用表单登录
.loginPage("/login") // 指定自定义登录页面的路径
.defaultSuccessURL("/dashboard") // 登录成功后的默认跳转页面
.permitAll() // 允许所有用户访问登录页面
.and()
.logout() // 启用注销功能
.logoutUrl("/logout") // 注销URL
.logoutSuccessUrl("/login") // 注销成功后跳转到登录页面
.permitAll(); // 允许所有用户注销
}
}
代码分析:
-
@Configuration
和@EnableWebSecurity
注解用于标识这是一个Spring Security配置类,并启用Spring Security功能。 -
configureGlobal
方法配置了内存中的用户,用于身份验证。在这个示例中,我们定义了两个用户,一个具有USER角色,另一个具有USER和ADMIN角色。密码采用了{noop}
前缀,表示密码不会进行加密处理,仅用于示例。 -
configure
方法配置了HTTP请求的安全性。我们使用authorizeRequests()
定义了URL的访问规则:/public/**
:允许所有用户访问公共资源。/admin/**
:仅允许拥有ADMIN角色的用户访问/admin/**路径。- 其他请求需要身份验证。
-
formLogin()
启用了基于表单的登录。我们指定了自定义登录页面的路径、登录成功后的默认跳转页面,并允许所有用户访问登录页面。 -
logout()
启用了注销功能,我们指定了注销URL、注销成功后的跳转页面,并允许所有用户注销。
上述配置是一个简单的Spring Security示例,用于保护应用程序中的资源和实现基本的身份验证和授权。根据具体的应用程序需求,可以进行更复杂的配置,包括自定义身份验证提供程序、访问控制规则、用户存储等。