为了授权请求,我们覆盖了 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的方法。
3条答案
按热度按时间pengsaosao1#
更改此行:
.antMatchers("/").hasRole("USER")
对此:.anyRequest().hasRole("USER")
.gt0wga4j2#
只检查配置的URL。如果不配置url,则根本不会对其进行检查。
因此,您应该添加一个检查所有其他URL的配置,请参阅spring安全参考:
11.2. 使用filtersecurityinterceptor授权httpservletrequest
[...]
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都被拒绝访问。如果您不想意外忘记更新授权规则,这是一个很好的策略。
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();
}
}
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorize -> authorize
.anyRequest().authenticated()
);
}