springsecurity基本使用
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
编写controller
@RestController
public class TestController {
@GetMapping("test")
public R test() {
return R.ok().data("data", "security");
}
}
访问请求security生效
用户名默认为user,密码为每次随机生成 ,看控制台打印
springsecurity基本原理
springsecurity本质上是一个过滤器链,从启动是可以获取到过滤器链
全部的过滤链15个
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4c5a2baf
org.springframework.security.web.context.SecurityContextPersistenceFilter@5cf8676a
org.springframework.security.web.header.HeaderWriterFilter@5ba03c82
org.springframework.security.web.csrf.CsrfFilter@5792c08c
org.springframework.security.web.authentication.logout.LogoutFilter@78ec89a6
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@62c72501
org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@dd4aec3
org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@1ec22831
org.springframework.security.web.authentication.www.BasicAuthenticationFilter@7e91ed74
org.springframework.security.web.savedrequest.RequestCacheAwareFilter@3520963d
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@a9c5b75 org.springframework.security.web.authentication.AnonymousAuthenticationFilter@63f855b
org.springframework.security.web.session.SessionManagementFilter@7ab1127c
org.springframework.security.web.access.ExceptionTranslationFilter@65afeb6d
org.springframework.security.web.access.intercept.FilterSecurityInterceptor@41fa769c
FilterSecurityInterceptor:是一个方法级的权限过滤器,基本位于过滤链的最底部
ExceptionTranslationFilter:是个异常过滤器,用来处理在认证授权过程中抛出的异常
UsernamePasswordAuthenticationFilter:对/login的POST请求做拦截,校验表单中用户名,密码
过滤器加载过程
使用springsecurity需要配置过滤器DelegatingFilterProxy
,由于整合了Spring Boot很多过程被自动处理了
DelegatingFilterProxy.java
FilterChainProxy.java
两个重要的接口:UserDetailsServie和PasswordEncoder
当什么也没有配置的时候,账号和密码是由Spring Security定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的,所以要通过自定义逻辑控制认证逻辑。如果需要自定义逻辑时,只需要实现UserDetailsServie接口即可
PasswordEncoder:加密密码的接口,用于返回User对象里密码加密
String encode(CharSequence var1):表示把参数按照特定的解析规则进行解析
boolean matches(CharSequence var1, String var2):表示验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。如果密码匹配,则返回true;如果不匹配,则返回false。第一个参数表示需要被解析的密码,第二个参数表示存储的密码。
boolean upgradeEncoding(String encodedPassword):表示如果解析的密码能够再次进行解析且达到更安全的结果则返回true,否则返回false。默认返回false
自定义逻辑实现步骤
创建类继承UsernamePasswordAuthenticationFilter
重写attemptAuthentication
方法,和继承自AbstractAuthenticationProcessingFilter
的successfulAuthentication
认证成功的方法和unsuccessfulAuthentication
认证失败的方法。attemptAuthentication
只是个得到用户名密码的过程,真正认证需要查询数据库就需要用到UserDetailsServie
接口所以还需要创建类实现UserDetailsServie
,编写查询数据库过程,返回User
对象,这个User对象是springsecurity安全框架提供的对象
// UserDetailsServie
public interface UserDetailsService {
UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;
}
返回值,这个类是系统默认的用户主体
String getPassword(); // 表示获取密码
String getUsername(); // 表示获取用户名
boolean isAccountNonExpired(); // 表示判断账户是否过期
boolean isAccountNonLocked(); // 表示判断账户是否被锁定
boolean isCredentialsNonExpired(); // 表示凭证{密码}是否过期
boolean isEnabled(); // 表示当前用户是否可用
以后只需要使用User这个实体类即可org.springframework.security.core.userdetails
,UserDetails
的实现类