Spring Security @PreAuthorize在控制器上

时间:2015-05-29 12:37:26

标签: spring-mvc spring-security

我正在尝试在某些控制器上使用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对我的控制器没有影响

1 个答案:

答案 0 :(得分:14)

你不能这样做,因为蚂蚁匹配者和@PreAuthorize在不同的层面上工作。

蚂蚁匹配器在 http 安全级别工作。 Spring安全过滤器查看请求,如果它发现应该拒绝访问,它甚至不会将请求传递给调度程序servlet,并直接发送403错误。

PreAuthorize方法级别工作。当一个方法即将被调用时,AOP代理控制是否应该允许访问。所以2个授权级别是链式,而不是第二个覆盖第一个。

无论如何,我强烈建议你在控制器上使用@PreAuthorize("hasRole('ADMIN')")

  • 可以使用简单的蚂蚁匹配器轻松完成
  • 它强制您允许在控制器上进行代理,使用类代理而不是JDK代理或使用控制器接口

恕我直言,@PreAuthorize最适合服务级别,因为您可以将域对象与用户授予的权限混合以获得细粒度的授权。