在Spring Security @PreAuthorize中使用其他bean和方法

use*_*933 5 spring spring-security

我想在 Spring Security 中使用SpEL,例如http://forum.spring.io/forum/spring-projects/security/100708-spel-and-spring-security-3-accessing-bean-reference-in@PreAuthorize中的示例-预授权 ,但这对我在 Spring Security 4.1.4 中使用它时不起作用。下面是我的示例代码:

豆类:

package com.service.spel;

import org.springframework.stereotype.Component;

@Component(value="accessBean")
public class AccessCheckBean {
    public String getPermision(){
        /**
         * return the api permision
         */
        String scope = "#oauth2.hasScope('resource.Update')";
        return scope;
    }
}
Run Code Online (Sandbox Code Playgroud)

在控制器中:

@PreAuthorize("accessBean.getPermision()")
@GetMapping("/perm")
public @ResponseBody String getPerm(){
    return "Perm";
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

无法评估表达式“accessBean.getPermission()”

看来我不能像上面那样使用 SpEL 。那么如果我使用这个版本的 Spring Security,我该如何进行?

dur*_*dur 4

你必须使用@,请参阅Spring Security参考:

在 Web 安全表达式中引用 Bean

如果您希望扩展可用的表达式,您可以轻松引用您公开的任何 Spring Bean。例如,假设您有一个名称为 的 Bean,webSecurity其中包含以下方法签名:

public class WebSecurity {
      public boolean check(Authentication authentication, HttpServletRequest request) {
              ...
      }
}
Run Code Online (Sandbox Code Playgroud)

您可以参考该方法使用:

<http>
  <intercept-url pattern="/user/**"
      access="@webSecurity.check(authentication,request)"/>
  ...
</http>
Run Code Online (Sandbox Code Playgroud)

或者在Java配置中

http
      .authorizeRequests()
              .antMatchers("/user/**").access("@webSecurity.check(authentication,request)")
              ...
Run Code Online (Sandbox Code Playgroud)