【问题标题】:Security config when using @PreAuthorize使用@PreAuthorize 时的安全配置
【发布时间】:2014-12-07 09:39:44
【问题描述】:

我的安全配置类(继承自 WebSecurityConfigurerAdapter)有如下方法。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/restaurant/**").access("hasRole('ROLE_USER')")
            .and()
        .formLogin();
}

但是我宁愿在我的控制器上使用@PreAuthorize。如果我删除该方法,一切都需要身份验证。我的方法应该是什么样子,这样一切都可用并且访问权限仅由 PreAuthorize 确定?

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

    如前所述,使用方法级别的安全性来保护控制器方法并不是很常见,而是使用业务逻辑来保护方法。即使您需要根据请求属性执行授权,也应该可以使用基于 URL 的安全性和 Web 安全性表达式来实现。

    可用表达式由WebSecurityExpressionRoot 类定义,其实例在评估Web 访问表达式时用作表达式根对象。该对象还直接暴露了名为request 下的HttpServletRequest 对象,因此您可以直接在表达式中调用请求。

    Here 您可以找到有关何时使用基于 URL 的安全性以及何时使用方法级安全性的更多详细信息。

    【讨论】:

      【解决方案2】:

      在控制器方法上使用@PreAuthorize 相当少见,但如果决定取决于请求参数,我可能会有用例......

      如果您不想在请求级别进行任何授权,您可以简单地:

      @Override
      protected void configure(HttpSecurity http) throws Exception {
          http.formLogin();
      }
      

      您只声明一个表单登录,并没有请求安全性。但不要忘记请求安全性比方法安全性使用更少的资源。

      【讨论】:

        【解决方案3】:

        试试.access("permitAll"),而不是.access("hasRole('ROLE_USER')")。请注意,对于没有 @PreAuthorize 的请求映射,每个人都将被授予访问权限。

        【讨论】:

          猜你喜欢
          • 2016-11-16
          • 2013-05-01
          • 2017-01-10
          • 2013-10-06
          • 2015-06-20
          • 2019-04-27
          • 2020-07-06
          • 2015-02-01
          • 2017-11-23
          相关资源
          最近更新 更多