SpringSecurity基本原理

199 阅读2分钟

SpringSecurity是基于spring框架,提供了一套web应用安全性的完整解决方案,其中它有两点重要核心功能,分别是用户认证与用户授权。

用户认证

验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。通俗点说就是系统认为用户是否能登录。

用户授权

用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。通俗点讲就是系统判断用户是否有权限去做某些事情。

SpringSecurity本质上其实是一个过滤器链,其中是含有很多个过滤器的,分别有如下:

org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter

org.springframework.security.web.context.SecurityContextPersistenceFilter

org.springframework.security.web.header.HeaderWriterFilter

org.springframework.security.web.csrf.CsrfFilter

org.springframework.security.web.authentication.logout.LogoutFilter

org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter

org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter

org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter

org.springframework.security.web.savedrequest.RequestCacheAwareFilter

org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter

org.springframework.security.web.authentication.AnonymousAuthenticationFilter

org.springframework.security.web.session.SessionManagementFilter

org.springframework.security.web.access.ExceptionTranslationFilter

org.springframework.security.web.access.intercept.FilterSecurityInterceptor

我们重点看其中三个过滤器

FileSecurityInterceptor

它是一个方法级的权限过滤器,位于过滤器链的最底部。

ExceptionTranslationFileter

异常过滤器,用来处理认证授权过程中抛出的异常。

UsernamePasswordAuthenticationFilter

对/login的Post请求做拦截,校验表单中的用户名和密码。

DelegatingFilterProxy

当我们需要使用springsecurity时,就需要使用这个类进行配置,如果是用了springboot且引入了springsecurity的依赖,那它会自动配置进去。

UserDetailsService接口

当什么都没配置时,账号与密码都是springsecurity自动生成的,但实际场景中账号密码是我们从数据库查询出来的,因此我们需要自定义控制逻辑认证逻辑。而要自定义逻辑时,就需要实现UserDetailService接口。

package org.springframework.security.core.userdetails;

public interface UserDetailsService {
    UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;
}

具体流程为:

①创建类继承UsernamePasswordAuthenticationFilter,重写里面其中的attemptAuthentication方法、successfulAuthentication方法和unsuccessfulAuthentication方法,后面两个方法分别是代表操作成功后调用的方法与操作失败后调用的方法

②查数据库数据过程:创建类实现UserDetailsService接口,编写查询数据过程,返回User对象,这个User对象是springsecurity框架中提供的对象

PasswordEncoder接口

在框架中提供数据加密功能的接口。