springsecurity权限控制的原理是如何实现的?

TheDisguiser 2020-08-07 17:07:00 java常见问答 4411

springsecurity一直是实现权限控制最佳选择之一,众所周知,想要掌握一门技术,它的原理是必须要懂的,这次就来看看springsecurity的权限控制原理。

框架原理

众所周知,我们如果要对Web资源进行安全保护,最佳方法还有比的过Filter的吗?如果还想对方法进行调用保护,又莫过于AOP。所以springSecurity在我们进行用户认证以及授予权限的时候,都会通过各种各样的拦截器来控制权限的访问,从而实现安全。

其主要过滤器如下:

WebAsyncManagerIntegrationFilter
SecurityContextPersistenceFilter
HeaderWriterFilter
CorsFilter
LogoutFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter
SessionManagementFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
UsernamePasswordAuthenticationFilter
BasicAuthenticationFilter

框架核心组件

SecurityContextHolder: 提供对SecurityContext的访问
SecurityContext, :持有Authentication对象和其他可能需要的信息
AuthenticationManager 其中可以包含多个AuthenticationProvider
ProviderManager对象为AuthenticationManager接口的实现类
AuthenticationProvider 主要用来进行认证操作的类 调用其中的authenticate() 方法去进行认证操作
Authentication: Spring Security方式的认证主体
GrantedAuthority: 对认证主题的应用层面的授权, 含当前用户的权限信息, 通常使用角色表示
UserDetails: 构建Authentication对象必须的信息, 可以自定义, 可能需要访问DB得到
UserDetailsService: 通过username构建UserDetails对象, 通过loadUserByUsername根据userName获取UserDetail对象

Spring Security流程

Spring Security框架里的安全访问控制分为Authentication(认证)及Authorization(授权,也叫“访问控制”)两种。其中,认证就是指用户登录的信息验证,会判断下你输入的账号密码是否正确;而授权就是指当用户访问一个页面时它有没有这个权限。如下:

1、 首先, 当用户登录时, 前端会把用户输入的用户名、 密码信息传输到后台, 后台用一个类对象将其封装起来,
通常使用的是UsernamePasswordAuthenticationToken这个类。
2、 再来, 到程序负责验证这个类对象。 验证方法是调用Service根据username从数据库中取用户信息到实体类的实例中,
比较两者的密码, 如果密码正确就成功登陆, 同时把包含着用户的用户名、 密码、 所具有的权限等信息的类对象
放到SecurityContextHolder(安全上下文容器, 类似Session) 中去。
3、 其次, 在用户访问一个资源的时候, 需要先判断是否是受限资源。 如果是的话还要判断当前是否未登录,
没有的话就跳到登录页面。
4、 最后!如果用户已经登录, 并访问一个受限资源的时候, 程序要根据url去数据库中取出该资源所对应的
所有可以访问的角色, 然后拿着当前用户的所有角色一一对比, 判断用户是否可以访问。

以上就是本篇文章的所有内容,关于springsecurity原理就是这样了,还有不懂得java架构师知识欢迎小伙伴们来我们网站了解详情。

推荐阅读:

springsecurity两套登陆规则是什么?springsecurity详解