无法评估具有 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}" />
我有一个 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}" />