spring引导安全配置httpsecurity

yhxst69z  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(160)

为了授权请求,我们覆盖了 configure(HttpSecurity) 方法中我们提到的访问api我们想要哪个角色。但是我们没有提到的api可以在没有登录的情况下访问。为什么会有这种行为?
我没有写信 permitAll() 对于API,为什么这是默认行为?

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin").hasRole("ADMIN")
                .antMatchers("/user").hasAnyRole("ADMIN", "USER")
                .antMatchers("/").hasRole("USER")
                .and()
            .formLogin();
    }
}

在此代码中 admin api可由管理员角色访问, user 管理员和用户角色都可以访问api, / api可以由用户角色访问,并且还有一个api /student 我没有提到,我可以访问没有登录。
问题是怎么连我都没写 permitAll() 学生api的方法。

pengsaosao

pengsaosao1#

更改此行: .antMatchers("/").hasRole("USER") 对此: .anyRequest().hasRole("USER") .

gt0wga4j

gt0wga4j2#

只检查配置的URL。如果不配置url,则根本不会对其进行检查。
因此,您应该添加一个检查所有其他URL的配置,请参阅spring安全参考:
11.2. 使用filtersecurityinterceptor授权httpservletrequest
[...]

protected void configure(HttpSecurity http) throws Exception {
    http
        // ...
        .authorizeRequests(authorize -> authorize                                1                     
            .mvcMatchers("/resources/**", "/signup", "/about").permitAll()       2  
            .mvcMatchers("/admin/**").hasRole("ADMIN")                           3  
            .mvcMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") 4  
            .anyRequest().denyAll()                                              5  
        );
}

1指定了多个授权规则。每一条规则都是按照它们声明的顺序来考虑的。
2我们指定了任意用户都可以访问的多个url模式。具体来说,如果url以“/resources/”、等于“/signup”或等于“/about”开头,则任何用户都可以访问请求。
3任何以“/admin/”开头的url都将被限制为具有“role\u admin”角色的用户。您会注意到,由于我们调用的是hasrole方法,所以不需要指定“role”前缀。
4任何以“/db/”开头的url都要求用户同时具有“role\u admin”和“role\u dba”。您会注意到,由于我们使用的是hasrole表达式,因此不需要指定“role\”前缀。
5任何尚未匹配的url都被拒绝访问。如果您不想意外忘记更新授权规则,这是一个很好的策略。

l3zydbqr

l3zydbqr3#

为了保护未在configure方法中配置的api,必须添加行 .anyRequest().denyAll() ```
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin").hasRole("ADMIN")
.antMatchers("/user").hasAnyRole("ADMIN", "USER")
.antMatchers("/").hasRole("USER")
.anyRequest().denyAll()
.and()
.formLogin();
}
}

对于每个要保护的请求,而不在configure方法中配置它

protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorize -> authorize
.anyRequest().authenticated()
);
}

相关问题