提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、目的
解决单点登录,我登陆之后你要保证我访问其他路径的时候不会被你拦截。
同时前后端分离,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();
}