SpringSecurity学习笔记之四:拦截请求

  在任何应用中,并不是所有请求都需要同等程度地保护起来。有些请求需要认证,有些则不需要。
对每个请求进行细粒度安全性控制的关键在于重载configure(HttpSecurity)方法。如下代码片段展现了重载的configure(HttpSecurity)方法,它为不同的URL路径有选择地应用安全性:

@Override
protected void configure(HttpSecurity http) throws Exception{
    http
      .authorizeRequests()
        .antMatchers("/spitters/me").authenticated()
        .antMatchers(HttpMethod.POST,"/spittles").authenticated()
        .anyRequest().permitAll();
}

antMatchers()方法所设定的路径支持Ant风格的通配符。如下

.antMatchers("/spitters/**","spittles/mine").authenticated();          //Ant风格

  antMatchers()方法所使用的路径可能会包括Ant风格的通配符,而regexMatchers()方法则能够接受正则表达式来定义请求路径。如下:

.regexMatchers("spitters/.*").authenticated();   //正则表达式风格

  除了路径选择,我们还通过authenticated()和permitAll()来定义该如何保护路径。authenticated()要求在执行该请求时,必须已经登录了应用。如果用户没有认证,Spring Security的Filter将会捕获该请求,并将用户重定向到应用的登录界面。同时permitAll()方法允许请求没有任何的安全限制。除了authenticated()和permitAll()以外,authorizeRequests()方法返回的对象还有更多的方法用于细粒度地保护请求。如下所示:

这里写图片描述

  我们可以将任意数量的antMatchers()、regexMatchers()和anyRequest()连接起来,以满足Web应用安全规则的需要。注意,将最不具体的路径(如anyRequest())放在最后面。如果不这样做,那不具体的路径配置将会覆盖掉更为具体的路径配置。

使用Spring表达式进行安全保护

  上面的方法虽然满足了大多数应用场景,但并不是全部。如果我们希望限制某个角色只能在星期二进行访问的话,那么就比较困难了。同时,上面的大多数方法都是一维的,如hasRole()方法和hasIpAddress()方法没办法同时限制一个请求路径。
  借助access()方法,我们可以将SpEL作为声明访问限制的一种方式。例如,如下就是使用SpEL表达式来声明具有“ROLE_SPITTER”角色才能访问“/spitter/me”URL:

.antMatchers("/spitters/me").access("hasRole('ROLE_SPITTER')");

  让SpEL更强大的原因在于,hasRole()仅是Spring支持的安全相关表达式中的一种。下表列出了Spring Security支持的所有SpEL表达式。

这里写图片描述

  现在,如果我们想限制“/spitter/me”URL的访问,不仅需要ROLE_SPITTER角色,还需要来自指定的IP地址,那么我们可以按照如下的方式调用access()方法:

.antMatchers("/spitter/me")
     .access("hasRole('SPITTER') and hasIpAddress('127.0.0.1')");
Spring Security拦截请求的另外一种方式:强制通道的安全性

  通过HTTP发送的数据没有经过加密,黑客就有机会拦截请求并且能够看到他们想看的数据。这就是为什么敏感信息要通过HTTPS来加密发送的原因。传递到configure()方法中的HttpSecurity对象,除了具有authorizeRequests()方法以外,还有一个requiresChannel()方法,借助这个方法能够为各种URL模式声明所要求的通道(如HTTPS)。
  在注册表单中,用户会希望敏感信息(用户不希望泄露的信息,如信用卡号等)是私密的。为了保证注册表单的数据通过HTTPS传送,我们可以在配置中添加requiresChannel()方法,如下所示:

@Override
protected void configure(HttpSecurity http) throws Exception{
   http
     .authorizeRequests()
       .antMatchers("/spitter/me").hasRole("SPITTER")
       .antMatchers(HttpMethod.POST,"/spittles").hasRole("SPITTER")
       .anyRequest().permitAll();
     .and()
     .requiresChannel()
       .antMatchers("spitter/form").requiresSecure();   //需要 
}

  不论何时,只要是对“/spitter/form”的请求,Spring Security都视为需要安全通道(通过调用requiresChannel()确定的)并自动将请求重定向到HTTPS上。
与之相反,有些页面并不需要通过HTTPS传送。例如,首页不包含任何敏感信息,因此并不需要通过HTTPS传送。我们可以使用requiresInsecure()代替requiresSecure()方法,将首页声明为始终通过HTTP传送:

.antMatchers("/").requiresInsecure();
防止跨站请求伪造

什么是跨站请求伪造?下面是一个简单的例子:

<form method="POST" action="http://www.spittr.com/Spittles">
    <input type="hidden" name="massage" value="I'm a stupid" />
    <input type="submit" value="Click here to win a new car!"/>
</form>

  这是跨站请求伪造(cross-site request forgery,CRSF)的一个简单样例。简单来讲,入过一个站点欺骗用户提交请求到其他服务器的话,就会发生CSRF攻击,这可能会带来很严重的后果。
  从Spring Security3.2开始,默认就会启用CSRF攻击。
  Spring Security通过一个同步token的方式来实现CSRF防护。它会拦截状态变化的请求并检查CSRF token。如果请求不包含CSRF token,或token不能与服务器端的token相匹配,请求将会失败,并抛出CsrfException。
Spring Security已经简化了将token放到请求的属性中这一任务。

  • 使用Thymeleaf,只要标签的action属性添加了Thymeleaf命名空间前缀,那么就会自动生成一个“_csrf”隐藏域:

    <form method="POST" th:action="@{/spittles}"> ... </form>

  • 使用JSP作为页面模板的话,要做的事非常类似:
<input type="hidden" name="${_csrf.parameterName}"  value="${_csrf.token}" />
  • 如果使用Spring表单绑定标签的话,标签会自动为我们添加隐藏的CSRF token标签。



上一篇: SpringSecurity学习笔记之三:配置用户存储
下一篇: SpringSecurity学习笔记之五:认证用户

  • 13
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring Security中,获取请求拦截token的过程可以通过以下步骤来实现: 1. 首先,在Spring Security的配置类中,你需要配置一个Token拦截器,用来拦截请求头中的Token信息。可以使用Spring Security提供的`UsernamePasswordAuthenticationFilter`来实现这个功能。 2. 在配置类中,你需要设置一个`AuthenticationManager`,用来管理用户的认证信息。`AuthenticationManager`会根据请求头中的Token进行用户的认证和授权。 3. 接下来,你需要定义一个Token提供者(TokenProvider),用来解析请求头中的Token,并验证Token的有效性。你可以使用Spring Security的`JwtTokenProvider`来实现这个功能。 4. 在Token提供者中,你可以使用`JwtUtil`等工具类来解析Token,获取其中的用户信息和权限信息。 5. 当请求到达时,Token提供者会对请求头中的Token进行验证。如果Token有效,则将用户信息和权限信息存储到`SecurityContext`中供后续使用。 6. 最后,你可以在需要进行权限验证的地方使用Spring Security提供的注解(如`@PreAuthorize`)来对请求进行权限控制。 综上所述,使用Spring Security获取请求拦截Token的过程包括配置Token拦截器、设置AuthenticationManager、定义Token提供者和验证Token的逻辑,以及使用注解进行权限控制。以上所述是一种常见的实现方式,具体的实现方式可能会根据项目的需求和架构而有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringSecurity实现前后端分离登录token认证详解](https://blog.csdn.net/qq_43649937/article/details/131168847)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值