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默认配置:
- 登录页面:路径([GET]/login)提供了简单的用户名密码登录表单,以及一个隐藏属性_csrf
-
登录接口:路径([POST]/login)
2.1 Content-Type=application/x-www-form-urlencoded
2.2 RequestBody[from-data](username=xxx&password=xxx&_csrf=xxx)
- 未认证时,拦截所有URL([GET]/login除外) ,重定向到登录页
- 默认登录用户:username=user;password=[在项目启动时可在输出日志中找到](Using generated security password: xxx)
通过默认配置即可实现一个简单的登录认证。
Spring Security 认证流程
通常情况下,默认配置没啥用,可以考虑在开发初期过渡一下。
先了解一下Spring Security的认证流程
- 过滤器基于拦截规则进行拦截
-
匹配路径依次执行过滤器[下列为默认拦截器,可在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
权限校验
...
-
登录认证[2.6 认证入口]
3.1 封装 请求Authentication
[存储认证需要的信息]作为token
3.2 通过 AuthenticationManager
对token进行认证
3.4 ProviderManager
[AuthenticationManager的默认实现]基于委托者模式通过List< AuthenticationProvider
> providers 实现认证
3.5 认证通过后将 认证Authentication
[存储认证通过用户的信息]存放到 SecurityContextHolder
中的 SecurityContext
中
-
权限认证[2.15 认证入口]
3.1 略...
Spring Security 自定义配置
-
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.1 封装请求Authentication
2.1 继承Authentication,新增拦截器处理。
2.2 略(期待更优雅的实现思路)...
2.2 重写认证逻辑
2.2.1 继承AuthenticationProvider,基于token获取真实用户并完成认证校验。
2.2.2 略(期待更优雅的实现思路)...
-
权限认证
略...
原文
https://segmentfault.com/a/1190000020790343