作者:jAne | 来源:互联网 | 2022-12-10 13:36
在定义新的Spring引导REST资源时,我倾向于忘记为其url模式创建spring安全配置.
默认情况下,如何拒绝访问所有URL,并且只允许访问明确配置的URL模式?(我.hasRole
用来允许访问)我想避免尽可能多的意外安全漏洞.
比方说,我有三个REST资源:/jobs
,/desks
和/salary
.我当前的代码可能如下所示:
http.authorizeRequests()
.antMatchers(HttpMethod.GET, "/jobs")
.hasRole("my_user")
.antMatchers(HttpMethod.GET, "/desks")
.hasRole("my_user");
但目前,/salary
每个人都可以访问url (因为它尚未配置)!
1> 小智..:
您可以默认拒绝所有请求:.anyRequest().denyAll()
和显式允许请求.hasRole
2> achAmháin..:
Spring的基于表达式的访问控制有一个denyAll
总是求值的表达式false
.
因此,您可以使用此denyAll
方法拒绝访问所有内容,然后可能允许通过以下方式访问某个URL hasRole
:
http.authorizeRequests().antMatchers("/admin/**").access("hasRole('ADMIN')").antMatchers("/**").denyAll();
因此,例如,这将允许具有ADMIN访问权限的用户访问以/admin
.开头的任何页面.然后它将拒绝访问所有其他页面.请注意,顺序很重要,就像您.antMatchers("/**").denyAll()
先输入一样,它将拒绝所有访问并忽略表达式的其余部分.
或者,您可以使用permitAll()
某个URL模式:
http.authorizeRequests().antMatchers("/users/**").permitAll().antMatchers("/**").denyAll();
请注意,您可能还需要允许访问某种登录方式,因此系统可以让某人使用特定角色登录,因此要将它们组合在一起,并允许每个人尝试登录,只有管理员用户才能访问管理页面并拒绝所有其他人,然后像:
http.authorizeRequests().antMatchers("/login").permitAll().antMatchers("/admin/**").access("hasRole('ADMIN')").antMatchers("/**").denyAll();