SpringSecurity 常见面试题汇总
阅读本文大概需要 5 分钟。
来自:blog.csdn.net/qq_33129875/article/details/129286417
1.什么是Spring Security?核心功能?
认证:提供了多种认证方式,如表单认证、HTTP Basic认证、OAuth2认证等,可以与多种身份验证机制集成。
授权:提供了多种授权方式,如角色授权、基于表达式的授权等,可以对应用程序中的不同资源进行授权。
攻击防护:提供了多种防护机制,如跨站点请求伪造(CSRF)防护、注入攻击防护等。
会话管理:提供了会话管理机制,如令牌管理、并发控制等。
监视与管理:提供了监视与管理机制,如访问日志记录、审计等。
2.Spring Security的原理?
用户请求Web应用程序的受保护资源。
Spring Security拦截请求,并尝试获取用户的身份验证信息。
如果用户没有经过身份验证,Spring Security将向用户显示一个登录页面,并要求用户提供有效的凭据(用户名和密码)。
一旦用户提供了有效的凭据,Spring Security将验证这些凭据,并创建一个已认证的安全上下文(SecurityContext)对象。
安全上下文对象包含已认证的用户信息,包括用户名、角色和授权信息。
在接下来的请求中,Spring Security将使用已经认证的安全上下文对象来判断用户是否有权访问受保护的资源。
如果用户有权访问资源,Spring Security将允许用户访问资源,否则将返回一个错误信息。
3.有哪些控制请求访问权限的方法?
permitAll() :允许所有用户访问该请求,不需要进行任何身份验证。
denyAll() :拒绝所有用户访问该请求。
anonymous() :允许匿名用户访问该请求。
authenticated() :要求用户进行身份验证,但是不要求用户具有任何特定的角色。
hasRole(String role) :要求用户具有特定的角色才能访问该请求。
hasAnyRole(String... roles) :要求用户具有多个角色中的至少一个角色才能访问该请求。
hasAuthority(String authority) :要求用户具有特定的权限才能访问该请求。
hasAnyAuthority(String... authorities) :要求用户具有多个权限中的至少一个权限才能访问该请求。
4.hasRole 和 hasAuthority 有区别吗?
ROLE_ADMIN
")。VIEW_REPORTS
",可以使用以下方式控制用户对页面的访问权限:.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/reports/**").hasAuthority("VIEW_REPORTS")
ROLE_ADMIN
"角色的用户才能访问/admin/路径下的页面,而具有"VIEW_REPORTS
"权限的用户才能访问/reports/
路径下的页面。5.如何对密码进行加密?
PasswordEncoder
)。PasswordEncoder
的作用是将明文密码加密成密文密码,以便于存储和校验。Spring Security 提供了多种常见的密码编码器,例如 BCryptPasswordEncoder
、SCryptPasswordEncoder
、StandardPasswordEncoder
等。BCryptPasswordEncoder
为例,使用步骤如下:BCryptPasswordEncoder
的依赖:<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-cryptoartifactId>
<version>5.6.1version>
dependency>
BCryptPasswordEncoder
:@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// ...
}
passwordEncoder.encode()
方法对密码进行加密,例如注册时对密码进行加密:@Service
public class UserServiceImpl implements UserService {
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public User register(User user) {
String encodedPassword = passwordEncoder.encode(user.getPassword());
user.setPassword(encodedPassword);
// ...
return user;
}
// ...
}
BCryptPasswordEncoder
对密码进行加密的步骤。使用其他密码编码器的步骤类似,只需将 BCryptPasswordEncoder
替换为相应的密码编码器即可。6.Spring Security基于用户名和密码的认证模式流程?
HttpServletRequest
中获得,用于认证的数据源策略有内存,数据库,ldap,自定义等。当用户访问需要授权的资源时,Spring Security会检查用户是否已经认证(即是否已登录),如果没有登录则会重定向到登录页面。
重定向到登录页面时,用户需要输入用户名和密码进行认证。
用户在登录页面输入用户名和密码,提交表单。
Spring Security的
UsernamePasswordAuthenticationFilter
拦截表单提交的请求,并将用户名和密码封装成一个Authentication
对象。AuthenticationManager
接收到Authentication
对象后,会根据用户名和密码查询用户信息,并将用户信息封装成一个UserDetails对象。如果查询到用户信息,则将UserDetails对象封装成一个已认证的
Authentication
对象并返回,如果查询不到用户信息,则抛出相应的异常。认证成功后,用户会被重定向到之前访问的资源。如果之前访问的资源需要特定的角色或权限才能访问,则还需要进行授权的过程。
Spring Security的认证流程大致可以分为两个过程,首先是用户登录认证的过程,然后是用户访问受保护资源时的授权过程。在认证过程中,用户需要提供用户名和密码,Spring Security通过
UsernamePasswordAuthenticationFilter
将用户名和密码封装成Authentication对象,并交由AuthenticationManager
进行认证。如果认证成功,则认证结果会存储在SecurityContextHolder
中。在授权过程中,Spring Security会检查用户是否有访问受保护资源的权限,如果没有则会重定向到登录页面进行认证。拦截未授权的请求,重定向到登录页面
推荐阅读:
Linus,乔布斯,比尔盖茨,扎克伯格等大佬的办公桌什么样?
互联网初中高级大厂面试题(9个G) 内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取! 朕已阅