这是我参与更文挑战的第6天,活动详情查看: 更文挑战
前言
本文主要讲述SpringSecurity是什么以及身份认证和授权流程
往期链接
一、了解Spring Security
Spring Security
是一个功能强大且高度可定制的身份验证和访问控制框架。它是保护基于 Spring 的应用程序的事实上的标准。
Spring Security
主要做两件事情身份验证(鉴权)与授权。Spring Security功能强大,一些主要支持的功能如下所示:
- 多种协议支持,如
OAuth 2.0
、SAML 2.0
- 多种身份认证方式,如
JDBC
、LDAP
、OpenID Connect
等 - 多种安全策略,如防止跨站请求伪造(CRSF)、会话固定攻击(劫持Session)等
熟练掌握Spring Security,首先就要知道它的架构是怎么设计的,以及工作的原理,不能仅仅停留在使用API的层面上。
核心组件
核心组件主要有以下几个(大致过一下就行)
Authentication:表示身份验证请求或身份验证主体的令牌
SecurityContext:Security上下文,主要用来保存Authentication
SecurityContextHolder: 提供给外部访问SecurityContext
GrantedAuthority:权限的载体
UserDetails:用户信息载体
UserDetailsService:主要用来加载用户信息
身份验证
身份验证主要分为以下几步
①:通过用户名密码构建 Authentication
的实例
②:将 Authentication
的实例交给 AuthenticationManager
验证
③:验证通过将 Authentication
保存到 SecurityContext
测试代码如下所示:
public class SecurityTest {
AuthenticationManager manager = new MyAuthenticationManager();
private String userName = "root";
private String psw = "123";
@Test
public void simpleTest() {
Authentication authentication = new UsernamePasswordAuthenticationToken(userName, psw);
Authentication ret = manager.authenticate(authentication);
SecurityContextHolder.getContext().setAuthentication(ret);
System.out.println("登陆成功");
}
}
class MyAuthenticationManager implements AuthenticationManager{
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
if ("root".equals(authentication.getName()) && "123".equals(authentication.getCredentials())) {
return new UsernamePasswordAuthenticationToken(authentication.getName(), authentication.getPrincipal());
}
throw new BadCredentialsException("用户名或密码错误");
}
}
复制代码
授权
SpringSecurity中授权的流程主要分为以下几步:
①:通过 AbstractSecurityInterceptor
拦截请求
②:AccessDecisionManager
负责最终的访问决策控制,比如某个用户的角色是否可以访问当前的API接口(注:接口已使用 @PreAuthorize("hasRole("xxx")")
标识)
二、总结
下一篇文章:在
简账
中是如何集成Spring Security
的
以上代码均可在简账后端中找到
感谢看到最后,非常荣幸能够帮助到你~♥