Spring Security权限控制系列(一)

这里我们通过Postman访问默认的登录/login接口先进行登录,登录完成后我们在访问这个post接口。

这里我们通过Postman访问默认的登录/login接口先进行登录,登录完成后我们在访问这个post接口。

Spring Security权限控制系列(一)

环境:Springboot2.4.12 + Spring Security 5.4.9

本篇主要内容是基于内存的配置

引入依赖

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

自定义用户配置

spring:  security:    user:      name: admin        password: 123456

定义Controller接口

@RestController@RequestMapping("/demos")public class DemoController {  @GetMapping("home")  public Object home() {    return "demos home" ;  }}

访问:

http://localhost:8080/demos/home。

将会自动跳转到默认地登录页面:

Spring Security权限控制系列(一)

使用配置文件中配置的admin/123123进行登录。

Spring Security权限控制系列(一)

没有任何问题

再定义一个POST接口。

@PostMapping("post")public Object post() {  return "demos post" ;}

注意:这里我们通过Postman访问默认的登录/login接口先进行登录,登录完成后我们在访问这个post接口。(记住我们在上面访问的GET /demos/home接口只要登录后就可以继续访问该接口)。

Spring Security权限控制系列(一)

首次登录时注意返回的登录页面的html内容,表单信息中多了一个隐藏域_csrf字段,如果我们通过Postman模拟登录时如果不带上该字段将无法登录。

Spring Security权限控制系列(一)

修改登录信息添加上_csrf表单字段,再进行登录。

Spring Security权限控制系列(一)

这里返回404状态码是由于我们没有配置默认登录成功页

到此在Postman中就登录成功了,接下来咱们继续通过Postman访问GET/demos/home接口。

Spring Security权限控制系列(一)

直接访问没有任何问题

接着访问上面定义的POST /demos/post接口。

Spring Security权限控制系列(一)

服务端返回403拒绝访问,上面GET方式正常,POST出现该异常,接着将上面我们登录时候的_csrf字段一起进行提交。

Spring Security权限控制系列(一)

针对POST请求必须携带正确的_csrf信息才能继续方法。

实现原理

在默认情况下Security会添加CsrfFilter过滤器。

public final class CsrfFilter extends OncePerRequestFilter {  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {    // 从默认的HttpSessionCsrfTokenRepository中获取token,默认是从session中    CsrfToken csrfToken = this.tokenRepository.loadToken(request);    boolean missingToken = (csrfToken == null);    if (missingToken) {      // 如果当前session不存在则生成token      csrfToken = this.tokenRepository.generateToken(request);      // 如果csrfToken不为null,则这里什么都不做(不会保存)      this.tokenRepository.saveToken(csrfToken, request, response);    }    // ...    // 判断当前的请求方法是否是("GET", "HEAD", "TRACE", "OPTIONS")    // 如果是上面的Method则直接放行,否则继续往下执行    if (!this.requireCsrfProtectionMatcher.matches(request)) {      filterChain.doFilter(request, response);      return;    }    // 从请求header中获取_csrf值,headerName = X-CSRF-TOKEN    String actualToken = request.getHeader(csrfToken.getHeaderName());    if (actualToken == null) {      // 如果header中不存在,则从请求参数中获取 parameterName = _csrf      actualToken = request.getParameter(csrfToken.getParameterName());    }    // 判断当前参数中的token值与保存到当前session中的是否想到,不等则返回403错误    if (!equalsConstantTime(csrfToken.getToken(), actualToken)) {      AccessDeniedException exception = (!missingToken) ? new InvalidCsrfTokenException(csrfToken, actualToken) : new MissingCsrfTokenException(actualToken);      this.accessDeniedHandler.handle(request, response, exception);      return;    }    filterChain.doFilter(request, response);  }}

一般我们都会关闭csrf功能。

@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {  @Override  protected void configure(HttpSecurity http) throws Exception {    // 关闭csrf,就是删除CsrfFilter过滤器。    http.csrf().disable() ;    // 拦截任意请求    http.authorizeRequests().anyRequest().authenticated() ;    // 这里需要加上该句,否则不会出现登录页面    http.formLogin() ;  }}

以上是关于Spring Security默认配置的情况下csrf相关问题。接下来通过自定义类配置来设定用户的用户信息。

自定义配置

@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {  @SuppressWarnings("deprecation")  @Override  protected void configure(AuthenticationManagerBuilder auth) throws Exception {    // 这在后续的文章中会介绍该方法的具体使用    // super.configure(auth);    // 配置用户名密码角色,及密码编码方式    auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance()).withUser("guest").password("123456").roles("ADMIN") ;  }  @Override  protected void configure(HttpSecurity http) throws Exception {    http.csrf().disable() ;    http.authorizeRequests().anyRequest().authenticated() ;    http.formLogin() ;  }}

通过上面配置后,在进行授权的时候就需要使用这里的配置信息。

本篇介绍到这里,下篇将介绍具体的请求拦截配置及自定义登录页面等功能更。

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月6日 10:47
下一篇 2023年5月6日 10:47

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信