了解关于spring-security的requestMatchers()

时间:2018-08-26 18:40:44

标签: spring-boot spring-security

我正在研究一些有关弹簧安全性的代码。我想了解我在互联网上找到的这个例子 1

teamMembers
:
Array(3)
0
:
{memberId: 4564, role: "", deleted: false, signatory: false, signatoryOrder: null, …}
1
:
{memberId: 4565, role: "", deleted: false, signatory: false, signatoryOrder: null, …}
2
:
{memberId: 4566, role: "", deleted: false, signatory: false, signatoryOrder: null, …}

:
current
:
false
deleted
:
false
enabled
:
1
memberId
:
4564
reportId
:
2936
reviewer
:
false
role
:
""
signatory
:
false
signatoryOrder
:
null
userProfile
:
contractor
:
false
email
:
"koryjcampbell@gmail.com"
firstName
:
"Kory"
id
:
null
lastName
:
"Campbell"
title
:
"Software Developer"
userAccountExists
:
false
userId
:
247
username
:
"koryjcampbell@gmail.com"






vm.teamGridOptions = {
    enableGridMenu: false,
    enableSorting: true,
    enableHorizontalScrollbar: 0, /*always hide horizontal scroll bar*/
    enableVerticalScrollbar: 1, /*always show vertical scroll bar*/
    rowHeight: 46,  
    columnDefs: [
            {
                    enableHiding: false,
                    enableColumnMenu: false,
                    displayName: 'First Name',
                    field: 'firstName',
                    cellClass: 'ui-grid-cell-contents',
                    cellTemplate: '<span>{{row.entity.teamMembers.userProfile.firstName}}</span>'

                },

}

我无法理解此配置,为什么需要此代码:

http.requestMatchers()
        .antMatchers("/management/**") // (1)
        .and()
        .authorizeRequests() // (2)
        .antMatchers("/management/health")
        .permitAll()
        .antMatchers("/management/info")
        .permitAll()
        .antMatchers("/management/**")
        .hasRole("ACTUATOR")
        .anyRequest().permitAll()
        .and()
        .httpBasic(); (3)

在.authorizeRequests()之前吗? (1)

那是什么意思?

你能解释这个例子吗?

2 :第二种情况是什么?

http.requestMatchers()
        .antMatchers("/management/**")
        .and() 

使用requestMatchers()有什么影响?

如果我向“ / rest / v1 / test / hello2”发送请求,我会收到401为什么为什么拒绝请求的规则与antMatchers(“ / rest2 / **”)不匹配?

2 个答案:

答案 0 :(得分:1)

requestMatchers()的目的是指定将对spring安全配置应用哪些请求。

例如,如果您有两个端点"/public""/private",而您只想将安全性(特别是csrf保护)应用于"/private",则可以添加以下配置:

http
    .requestMatchers()
        .antMatchers("/private/**")
        .and()
    .csrf();

然后,如果您发布到"/private",则会收到403响应。
但是,如果您发布到"/public",则会得到200,因为没有应用安全性。

这与authorizeRequests分开,后者指示该端点所需的访问权限的类型,与是否完全应用安全性相反。

在您提到的示例1中

http
    .requestMatchers()
        .antMatchers("/management/**")
        .and() 
        ...

该安全配置仅应用于"/management/**",因此,如果您向"/foo"发出请求,则该安全配置将不受保护。

在您提到的示例2中,

http
    .requestMatchers()
        .antMatchers("/rest2/**")
        .and()
    .authorizeRequests()
        .antMatchers("/rest/v1/test/hello").permitAll()
        .antMatchers("/rest/v1/test/**").denyAll()
        .and()
    .requestMatchers()
        .antMatchers("/rest/**")
        .and()
    .authorizeRequests()
        .antMatchers("/rest/v1/test/hello").permitAll();

"/rest/v1/test/hello2"响应为401的原因是因为"/rest/**"在请求匹配器中,因此您的安全规则.antMatchers("/rest/v1/test/hello").permitAll()将适用。
如果您要向"/rest3/v1/test/hello2"发送请求,则它将以200响应,因为"/rest3/**"不属于任何请求匹配器。

答案 1 :(得分:0)

Spring安全性API: 公共最终类HttpSecurity.RequestMatcherConfigurer 扩展AbstractRequestMatcherRegistry

允许映射此HttpSecurity将用于的HTTP请求