SpringSecurity快速入门

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生效

image-20210506194905718

用户名默认为user,密码为每次随机生成 ,看控制台打印

image-20210506195007262

image-20210506195024064

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:是一个方法级的权限过滤器,基本位于过滤链的最底部

image-20210506195730824

ExceptionTranslationFilter:是个异常过滤器,用来处理在认证授权过程中抛出的异常

image-20210506200030553

UsernamePasswordAuthenticationFilter:对/login的POST请求做拦截,校验表单中用户名,密码

image-20210506200323739

过滤器加载过程

使用springsecurity需要配置过滤器DelegatingFilterProxy,由于整合了Spring Boot很多过程被自动处理了

DelegatingFilterProxy.java

image-20210506200805585

image-20210506200908806

FilterChainProxy.java

image-20210506201728904

image-20210506202102233

image-20210506202223222

两个重要的接口:UserDetailsServie和PasswordEncoder

当什么也没有配置的时候,账号和密码是由Spring Security定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的,所以要通过自定义逻辑控制认证逻辑。如果需要自定义逻辑时,只需要实现UserDetailsServie接口即可

PasswordEncoder:加密密码的接口,用于返回User对象里密码加密

image-20210506205234954

String encode(CharSequence var1):表示把参数按照特定的解析规则进行解析

boolean matches(CharSequence var1, String var2):表示验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。如果密码匹配,则返回true;如果不匹配,则返回false。第一个参数表示需要被解析的密码,第二个参数表示存储的密码。

boolean upgradeEncoding(String encodedPassword):表示如果解析的密码能够再次进行解析且达到更安全的结果则返回true,否则返回false。默认返回false

自定义逻辑实现步骤

创建类继承UsernamePasswordAuthenticationFilter重写attemptAuthentication方法,和继承自AbstractAuthenticationProcessingFiltersuccessfulAuthentication认证成功的方法和unsuccessfulAuthentication认证失败的方法。attemptAuthentication只是个得到用户名密码的过程,真正认证需要查询数据库就需要用到UserDetailsServie接口所以还需要创建类实现UserDetailsServie,编写查询数据库过程,返回User对象,这个User对象是springsecurity安全框架提供的对象

image-20210506204054532

// UserDetailsServie
public interface UserDetailsService {
    UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;
}

返回值,这个类是系统默认的用户主体

image-20210506204108527

String getPassword(); // 表示获取密码

String getUsername(); // 表示获取用户名

boolean isAccountNonExpired(); // 表示判断账户是否过期

boolean isAccountNonLocked(); // 表示判断账户是否被锁定

boolean isCredentialsNonExpired(); // 表示凭证{密码}是否过期

boolean isEnabled(); // 表示当前用户是否可用

以后只需要使用User这个实体类即可org.springframework.security.core.userdetailsUserDetails的实现类

image-20210506204401933

image-20210506204321872

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值