springSecurity总结

springSecurity总结:spring

 

1、Spring security框架简介数据库


     一、简介
           一个可以为基于Spring的企业应用系统提供声明式的安全訪问控制解决方式的安全框架(简单说是对访问权限进行控制嘛),应用的安全性包括用户认证(Authentication)和用户受权(Authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户可否访问该系统。用户认证通常要求用户提供用户名和密码。系统经过校验用户名和密码来完成认证过程。用户受权指的是验证某个用户是否有权限执行某个操做。在一个系统中,不一样用户所具备的权限是不一样的。好比对一个文件来讲,有的用户只能进行读取,而有的用户能够进行修改。通常来讲,系统会为不一样的用户分配不一样的角色,而每一个角色则对应一系列的权限。   spring security的主要核心功能为 认证和受权,全部的架构也是基于这两个核心功能去实现的。缓存

 

     二、框架原理
         众所周知 想要对对Web资源进行保护,最好的办法莫过于Filter,要想对方法调用进行保护,最好的办法莫过于AOP。因此springSecurity在咱们进行用户认证以及授予权限的时候,经过各类各样的拦截器来控制权限的访问,从而实现安全。安全


        以下为其主要过滤器  :架构

 

        WebAsyncManagerIntegrationFilter :  将 Security 上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成。框架

       SecurityContextPersistenceFilter异步

       HeaderWriterFilter ide

        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对象 (能够在这里基于自身业务进行自定义的实现  如经过数据库,xml,缓存获取等)           
 

  四、springSecurity工做原理:

这篇博客已经讲得很是细了: http://www.javashuo.com/article/p-tgsvcawe-ek.html

源码分析认证流程:https://blog.csdn.net/lizc_lizc/article/details/84061657

 

 

2、动手实现

 一、实现以前咱们先了解一下springSecurity 的几个相关注解:

@Configuration和@Bean

@Configuration写在类上,说明这是一个配置文件,而后用@Bean来声明方法。方法通常返回的都是类的实例。意思是至关于xml文件中声明的bean。

@EnableGlobalMethodSecurity

Spring Security默认是禁用注解的,要想开启注解,须要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解

@EnableGlobalMethodSecurity(securedEnabled=true) 开启@Secured 注解过滤权限
@EnableGlobalMethodSecurity(jsr250Enabled=true)开启@RolesAllowed 注解过滤权限 
@EnableGlobalMethodSecurity(prePostEnabled=true) 使用表达式时间方法级别的安全性         
4个注解可用: @PreAuthorize 在方法调用以前,基于表达式的计算结果来限制对方法的访问 @PostAuthorize 容许方法调用,可是若是表达式计算结果为false,将抛出一个安全性异常 @PostFilter 容许方法调用,但必须按照表达式来过滤方法的结果 @PreFilter 容许方法调用,但必须在进入方法以前过滤输入值

 

2:认证相关的类和接口:

UserDetailsService(接口):

接口里的惟一一个方法,接收String类型的用户名参数,经过当前登陆进来的用户查询用户信息,返回UserDetails(接口)

 

UserDetails(接口)

Spring Security的核心接口,它表明一个主体,是扩展的,也是Security认证须要提供的类, 一般UserDetails转换成你系统提供的类

 

SecurityContextHolder

咱们经过下面这种方法来获取当前用户信息:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); if (principal instanceof UserDetails) { String username = ((UserDetails)principal).getUsername(); } else { String username = principal.toString(); }

Authentication

Authentication是一个接口,用来表示用户认证信息的,在用户登陆认证以前相关信息会封装为一个Authentication具体实现类的对象,在登陆认证成功以后又会生成一个信息更全面,包含用户权限等信息的Authentication对象,而后把它保存在SecurityContextHolder所持有的SecurityContext中,供后续的程序进行调用,如访问权限的鉴定等。

 

 

PasswordEncoder(接口)
springSecurity提供的密码加密、密码匹配(比对)接口,
BCryptPasswordEncoder实现此接口,所以能够直接调用BCryptPasswordEncoder 的encode方法加密,
固然也可使用springSecurity提供的
Md5PasswordEncoder md5PasswordEncoder = new Md5PasswordEncoder(); 类进行加密
 
相关文章
相关标签/搜索