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架构师知识欢迎小伙伴们来我们网站了解详情。
推荐阅读: