转载

【spring Security】 SpringBoot集成

Spring Security SpringBoot集成

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

Spring Security 默认配置

在SpringBoot启动类上添加@EnableWebSecurity

Spring Security默认配置:

  1. 登录页面:路径([GET]/login)提供了简单的用户名密码登录表单,以及一个隐藏属性_csrf
  2. 登录接口:路径([POST]/login)
    2.1 Content-Type=application/x-www-form-urlencoded
    2.2 RequestBody[from-data](username=xxx&password=xxx&_csrf=xxx)
  3. 未认证时,拦截所有URL([GET]/login除外) ,重定向到登录页
  4. 默认登录用户:username=user;password=[在项目启动时可在输出日志中找到](Using generated security password: xxx)

通过默认配置即可实现一个简单的登录认证。

Spring Security 认证流程

通常情况下,默认配置没啥用,可以考虑在开发初期过渡一下。

先了解一下Spring Security的认证流程

  1. 过滤器基于拦截规则进行拦截
  2. 匹配路径依次执行过滤器[下列为默认拦截器,可在FilterChainProxy.doFilter()方法中debug获取]
    2.1 WebAsyncManagerIntegrationFilter 支持集成Spring的异步调用
    2.2 SecurityContextPersistenceFilter 从Session中获取SecurityContext,没有则新建,最终放到SecurityContextHolder中。
    2.3 HeaderWriterFilter 往响应对象response中写入Header属性(Like X-Frame-Options, X-XSS-Protection and X-Content-Type-Options)
    2.4 CsrfFilter csrf校验
    2.5 LogoutFilter 处理登出逻辑
    2.6 UsernamePasswordAuthenticationFilter 基于请求对象request,封装UsernamePasswordAuthenticationToken,并通过AuthenticationManager.authenticate(token)完成认证
    2.7 DefaultLoginPageGeneratingFilter 生成并返回登录界面
    2.8 DefaultLogoutPageGeneratingFilter 生成并返回登出界面
    2.9 BasicAuthenticationFilter 认证Basic[Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==]
    2.10 RequestCacheAwareFilter 用于用户登录成功后,重新恢复因为登录被打断的请求
    2.11 SecurityContextHolderAwareRequestFilter 包装request实现servlet api的一些接口方法isUserInRole、getRemoteUser
    2.12 AnonymousAuthenticationFilter 匿名认证
    2.13 SessionManagementFilter Session管理
    2.14 ExceptionTranslationFilter 异常处理
    2.15 FilterSecurityInterceptor 权限校验
    ...
  3. 登录认证[2.6 认证入口]
    3.1 封装 请求Authentication [存储认证需要的信息]作为token
    3.2 通过 AuthenticationManager 对token进行认证
    3.4 ProviderManager [AuthenticationManager的默认实现]基于委托者模式通过List< AuthenticationProvider > providers 实现认证
    3.5 认证通过后将 认证Authentication [存储认证通过用户的信息]存放到 SecurityContextHolder 中的 SecurityContext
  4. 权限认证[2.15 认证入口]
    3.1 略...

Spring Security 自定义配置

  1. URL配置:
    1.1 访问检验URL[登录校验、权限校验]
    1.2 登录页面URL[GET] 默认 /login
    1.3 登录认证URL[POST] 默认 /login
    1.4 登出页面URL[GET] 默认 /logout
    1.5 登出认证URL[POST] 默认 /logout
  2. 登录认证

    2.1 封装请求Authentication

    2.1 继承Authentication,新增拦截器处理。
     2.2 略(期待更优雅的实现思路)...

    2.2 重写认证逻辑

    2.2.1 继承AuthenticationProvider,基于token获取真实用户并完成认证校验。
     2.2.2 略(期待更优雅的实现思路)...
  3. 权限认证
    略...
原文  https://segmentfault.com/a/1190000020790343
正文到此结束
Loading...