我正在尝试在某些控制器上使用url(基于ant)匹配以及@PreAuthorize(“permitAll”),即
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
x, n = np.mgrid[0:20:0.01, 1:100:1]
mu = 0
sigma = np.sqrt(2)/n
f = norm.cdf(x, mu, sigma)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(x, n, f, rstride=x.shape[0]//20, cstride=x.shape[1]//20, alpha=0.3)
plt.show()
SecurityConfig:
@Controller
@RequestMapping("/register")
public class RegistrationController {
...
@PreAuthorize("permitAll")
@RequestMapping(method = RequestMethod.GET)
public String register() { ... }
我也尝试将@EnableGlobalMethodSecurity添加到我的MVC配置中:
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated()
但这没有效果
但是,我仍然会在按下/注册时提示进行身份验证。如果我将“/ register”添加到蚂蚁匹配器,它就可以工作,即.antMatchers(“/”,“/ register”)。permitAll()
我在这里缺少什么?似乎@PreAuthorize对我的控制器没有影响
答案 0 :(得分:14)
你不能这样做,因为蚂蚁匹配者和@PreAuthorize
在不同的层面上工作。
蚂蚁匹配器在 http 安全级别工作。 Spring安全过滤器查看请求,如果它发现应该拒绝访问,它甚至不会将请求传递给调度程序servlet,并直接发送403错误。
PreAuthorize
在方法级别工作。当一个方法即将被调用时,AOP代理控制是否应该允许访问。所以2个授权级别是链式,而不是第二个覆盖第一个。
无论如何,我强烈建议你不在控制器上使用@PreAuthorize("hasRole('ADMIN')")
:
恕我直言,@PreAuthorize
最适合服务级别,因为您可以将域对象与用户授予的权限混合以获得细粒度的授权。