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

时间:2017-03-08 13:48:24

标签: spring-security

我想在Spring Security中使用<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-htmlunit-driver</artifactId> <version>2.52.0</version> </dependency> 和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中使用它时,这对我不起作用。以下是我的示例代码:

bean类:

$request = new HttpRequest();
$request->setUrl('https://demo.mifinitypay.com/api/oauth/token');
$request->setMethod(HTTP_METH_POST);

$request->setHeaders(array(
  'postman-token' => '6396dfb7-540b-0e7d-7333-5d0eeff4d606',
  'cache-control' => 'no-cache',
  'authorization' => 'Basic username:password encoded using Base64',
  'x-api-version' => '1',
  'accept' => 'application/json',
  'content-type' => 'application/x-www-form-urlencoded'
));

$request->setContentType('application/x-www-form-urlencoded');
$request->setPostFields(array(
  'grant_type' => 'client_credentials'
));

try {
  $response = $request->send();

  echo $response->getBody();
} catch (HttpException $ex) {
  echo $ex;
}

在控制器中:

@PreAuthorize

错误讯息:

  

无法评估表达式&#39; accessBean.getPermision()&#39;

似乎我不能像上面那样使用SpEL,那么如果我使用的是此版本的Spring Security,我该如何处理?

1 个答案:

答案 0 :(得分:2)

您必须使用@,请参阅Spring Security Reference

  

参考网络安全表达式中的Bean

     

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

     
public class WebSecurity {
      public boolean check(Authentication authentication, HttpServletRequest request) {
              ...
      }
}
     

您可以使用以下方法参考该方法:

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

或Java配置

     
http
      .authorizeRequests()
              .antMatchers("/user/**").access("@webSecurity.check(authentication,request)")
              ...