简单理解springsecurity实现过程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、目的

解决单点登录,我登陆之后你要保证我访问其他路径的时候不会被你拦截。
同时前后端分离,session不再适用。

二、基本理解

security这一个单词其实就代表了springsecurity是为了安全而产生的。
而在原本的spring中和安全有关的是他的拦截器、是fiter。
故:springsecurity的本质实现也是一个过滤链,由不同的过滤器组成,而具体有几个,版本不同,数量也不同。不过主要有三个重要的:

  • UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求
  • ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException
  • FilterSecurityInterceptor:负责权限校验的过滤器
    而在各种过滤器之间向后传递信息的载体是SecurityContextHolder,格式是Authentication。

UsernamePasswordAuthenticationFilter

登录:自定义登录接口,并且放行。我们自己拿着账号密码求数据库验证,验证通过,会生成jwt,存入redis,
校验:自定义一个过滤器,这个过滤器会去获取请求头中的token,对token进行解析取出其中的userid。​ 使用userid去redis中获取对应的LoginUser对象
这个过滤器一般会放在userpassword那个过滤器前面。

ExceptionTranslationFilter

​ 如果是认证过程中出现的异常会被封装成AuthenticationException然后调用AuthenticationEntryPoint对象的方法去进行异常处理。

​ 如果是授权过程中出现的异常会被封装成AccessDeniedException然后调用AccessDeniedHandler对象的方法去进行异常处理。

​ 所以如果我们需要自定义异常处理,我们只需要自定义AuthenticationEntryPoint和AccessDeniedHandler然后配置给SpringSecurity即可。

FilterSecurityInterceptor

校验其实就是我认可了你是个好人,但是不同个人的权限不一样,我要识别你这个人有没有资格去访问这个功能。

做法是:我在验证完你是否是好人之后,相当于已经把你的信息拿到了我把你的权限查出来(因为数据库肯定有相关信息的),和基本信息一起放到ContextHolder里面传到FilterSecurityInterceptor。

三、跨域

SpringBoot配置

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
      // 设置允许跨域的路径
        registry.addMapping("/**")
                // 设置允许跨域请求的域名
                .allowedOriginPatterns("*")
                // 是否允许cookie
                .allowCredentials(true)
                // 设置允许的请求方式
                .allowedMethods("GET", "POST", "DELETE", "PUT")
                // 设置允许的header属性
                .allowedHeaders("*")
                // 跨域允许时间
                .maxAge(3600);
    }
}
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //关闭csrf
                .csrf().disable()
                //不通过Session获取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                // 对于登录接口 允许匿名访问
                .antMatchers("/user/login").anonymous()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated();

        //添加过滤器
        http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);

        //配置异常处理器
        http.exceptionHandling()
                //配置认证失败处理器
                .authenticationEntryPoint(authenticationEntryPoint)
                .accessDeniedHandler(accessDeniedHandler);

        //允许跨域
        http.cors();
    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值