Spring Security快速入门

一、Spring Security

刚才我们介绍了Spring Security的基本概念及作用,下面我们就详细解读一下Spring Security框架,首先我们先来快速感受一下Spring Security,完成一个认证的案例

我们之前没用安全框架是怎么认证呢?

比如下图展示的,先写登录接口,然后使用自定义的过滤器来实现校验

暂时无法在飞书文档外展示此内容

当我们使用了安全框架之后,这些校验的过滤器就不用自己定义了,框架已经帮我们实现了。

1、快速入门

(1)、史上最简单案例
  1. 我们打开课程配套的空工程,这里只写了hello。赶快跑起来,我们可以在浏览器输入http://localhost:8080/hello 会看到浏览器输出 hello ,目前这个工程,是没有权限控制的。

  2. pom.xml 引入依赖

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

    3.览器输入 http://localhost:8080/hello 这时会自动跳转到一个默认登陆页面

默认用户名是user,密码会输出在控制台。

输入用户名user(默认值)和密码后,会再次跳回到hello的输入页面。

4.如果退出登录,则需要访问:http://localhost:8080/logout

结论:

只要是集成了Spring Security框架之后,项目中的所有资源都得到了保护,必须经过认证之后才能访问,为什么只是集成了pom之后就能保护程序呢?关键还是框架内容提供了一系列的过滤器来进行了安全校验。

当然框架固然好用,但是也有一些其他的问题需要我们一一解开:

  1. 框架提供的登录页面非常丑陋,并且访问速度也很慢

      我们希望设置自己的登录页面作为登录页

  2. 目前登录的用户是默认的user,密码也是生成在控制台

      希望能够从数据库中查询用户,并且校验自定义的用户名和密码

  3. 其他问题

    a.密码是如何加密解密的     b.登录之后的用户信息怎么获取

基于以上的问题,我们下面依次来解决这些问题

(2)、自定义登录页

当设置完自定义的登录页面之后,可以解决两个问题,第一个是访问速度会更快,第二个,自定义的登录页也更美观,下面我们可以自定义页面来设置为登录页

  1. 将当天资料目录中的登录页面拷贝到我们的项目中的resource 目录下的 static目录

   2.创建配置类SecurityConfig,配置登录页

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

        http.formLogin()             //自定义自己编写的登陆页面
                .loginPage("/login.html")    //登录页面设置
                .loginProcessingUrl("/login") //登录访问路径
                .permitAll()//登录页和登录访问路径无需登录也可以访问
                .and()
                .authorizeRequests()
                .antMatchers("/css/**","/images/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .csrf().disable();    //关闭csrf防护
        return http.build();
    }

}

再次运行项目,我们会看到登录页面,变成下面这个样子啦

  (3)、获取当前登录用户

在很多业务场景中,我们都需要获取当前登录的用户信息,已做下一步的处理,如果我们使用了Spring Security框架,在内部提供了API对用户进行了存储,如下代码,可以获取用户的信息

修改HelloController 的hello方法

@RequestMapping("/hello")
public String hello(){
    //认证成功,得到认证成功之后用户信息
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    String userName = authentication.getName();
    return "hello  "+userName;
}

运行后效果如下:

我们通过SecurityContextHolder这个类中的API就能获取上下文中的用户信息了。

结论

通过自定义登录页的设置,我们就解决了访问速度慢和框架自带登录页面丑陋的问题了,同时呢,我们也通过了

SecurityContextHolder工具类获取上下文来拿到了登录后的用户信息。

(4)、SpringSecurity基本原理

到目前为止呢,入门案例我们就做完了,不过可能很多同学有疑问,这个到底是如何实现的呢?

其实Spring-Security其内部基础的处理方式就是通过过滤器来实现的,来我们看下刚才的例子用到的一些过滤器

这几个过滤器都是干啥的呢?

  • UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。

  • ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException。

  • FilterSecurityInterceptor:负责权限校验的过滤器。

当然,SpringSecurity过滤器不止这些的,下面我们把他们展示出来,不需要同学们记忆,只需了解即可!

过滤器

作用

WebAsyncManagerlntegrationFilter

将WebAsyncManger与SpringSecurity上下文进行集成

SecurityContextPersistenceFilter

在处理请求之前,将安全信息加载到SecurityContextHolder中

HeaderWriterFilter

处理头信息假如响应中

CsrfFilter

处理CSRF攻击

LogoutFilter

处理注销登录

UsernamePasswordAuthenticationFilter

处理表单登录

DefaultLoginPageGeneratingFilter

配置默认登录页面

DefaultLogoutPageGeneratingFiltel

配置默认注销页面

BasicAuthenticationFilter

外理HttpBasic登录

RequestCacheAwareFilter

处理请求缓存

SecurityContextHolderAwareRequestFilter

包装原始请求

AnonvmousAuthenticationFilter

配置匿名认证

SessionManagementFilter

外理session并发问题

ExceptionTranslationFilter

处理认证/授权中的异常

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值