简账(开源记账软件)-简述SpringSecurity前

这是我参与更文挑战的第6天,活动详情查看: 更文挑战

前言

本文主要讲述SpringSecurity是什么以及身份认证和授权流程

往期链接

一、了解Spring Security

Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。它是保护基于 Spring 的应用程序的事实上的标准。

Spring Security 主要做两件事情身份验证(鉴权)与授权。Spring Security功能强大,一些主要支持的功能如下所示:

  • 多种协议支持,如 OAuth 2.0SAML 2.0
  • 多种身份认证方式,如 JDBCLDAPOpenID 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
以上代码均可在简账后端中找到

感谢看到最后,非常荣幸能够帮助到你~♥