无法评估具有 spring 安全性的表达式

Failed to evaluate expression with spring security

我有一个 Spring 休息服务,我正在尝试为其增加安全性。我按照 this tutorial,但是当我尝试直接访问该服务时,出现以下错误:

There was an unexpected error (type=Internal Server Error, status=500). Failed to evaluate expression 'ROLE_USER'

这是我的安全配置:

webSecurityConfig.xml

<http entry-point-ref="restAuthenticationEntryPoint">
      <intercept-url pattern="/**" access="ROLE_USER"/>

      <form-login
         authentication-success-handler-ref="mySuccessHandler"
         authentication-failure-handler-ref="myFailureHandler"
      />

      <logout />
   </http>

   <beans:bean id="mySuccessHandler"
      class="com.eficid.cloud.security.rest.AuthenticationSuccessHandler"/>
   <beans:bean id="myFailureHandler" class=
     "org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"/>


      <authentication-manager>
        <authentication-provider>
          <user-service>
            <user name="temp" password="temp" authorities="ROLE_USER" />
          </user-service>
        </authentication-provider>
      </authentication-manager> 

SpringSecurityConfig:

public class SpringSecurityConfig {

    public SpringSecurityConfig() {
        super();
    }

}

我在尝试使用 curl 登录时也遇到此错误:

{
"timestamp":1460399841286,
"status":403,"error":"Forbidden",
"message":"Could not verify the provided CSRF token because your session was not found.",
"path":"/spring-security-rest/login"
}

我是否需要手动将 csrf 令牌添加到命令中?该服务有一个自签名证书,如果这有什么不同的话。

您需要 hasRole('ROLE_USER') 在 intercept-url 元素中。

<intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>

请参阅 docs 了解您可以使用的其他表达式。

Spring 安全块 POST 请求。

要启用它,您可以:

  • 在所有表单请求之后添加:

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" class="form-control" />

(例如: <form id="computerForm" action="addComputer" method="POST"> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" class="form-control" />

)

  • 或者如果您使用注解,您可以通过在您的 WebSecurityConfigurerAdapter 上添加 csrf().disable 来直接在您的代码中允许 POST(我还没有找到 xml 等价物):

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

如果您不需要启用 CRF,那么您可以在 webSecurityConfig.xml 文件中禁用它,如下所示:

        <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/login.html" access="hasRole('ANONYMOUS')" />
        <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
        <!-- This form is a default form that used to login  
            <http-basic/>
         -->
         <form-login login-page="/login.html"/>
         <csrf disabled="true"/>
    </http>

如果启用了 CSRF,您必须在要登录的页面中包含 _csrf.token 或 logout.The 下面的代码需要添加到表单中:

<input type="hidden" name="${_csrf.parameterName}"
            value="${_csrf.token}" />