Spring Method Level Security 在第二次调用时失败

Posted

技术标签:

【中文标题】Spring Method Level Security 在第二次调用时失败【英文标题】:Spring Method Level Security fails on second call 【发布时间】:2011-07-11 16:46:49 【问题描述】:

我想在我的 GWT 应用程序上使用方法级别的安全性。我正在尝试使用 Spring Security 3.1,因为我找到了一个工作示例here,但它不使用表单登录。读取this answer后第一个方法调用成功获取SecurityContext,但在下一次调用前将其清除:

[org.springframework.security.web.context.HttpSessionSecurityContextRepository] - Obtained a valid SecurityContext from SPRING_SECURITY_CONTEXT: 'org.springframework.security.core.context.SecurityContextImpl@6fe9f089: Authentication: org.example.MyAppName.server.auth.MyAppNameUserAuthentication@6fe9f089'
...
[org.springframework.security.access.intercept.aspectj.AspectJMethodSecurityInterceptor] - Authorization successful
...
[org.springframework.security.web.context.SecurityContextPersistenceFilter] - SecurityContextHolder now cleared, as request processing completed
...
[org.springframework.security.web.context.HttpSessionSecurityContextRepository] - SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
[org.springframework.security.web.context.SecurityContextPersistenceFilter] - SecurityContextHolder now cleared, as request processing completed
...
[org.springframework.security.web.context.HttpSessionSecurityContextRepository] - HttpSession returned null object for SPRING_SECURITY_CONTEXT

第二次调用发生在第一次调用之后,用户登录之后。

是不是因为我按照另一个答案删除了<http pattern="/MyAppName/**" security="none" />并添加了<intercept-url pattern="/MyAppName/**" access="permitAll()" />

我的过滤器如下:

<http pattern="/favicon.ico" security="none" />

<http access-decision-manager-ref="accessDecisionManager" use-expressions="true" auto-config="false" entry-point-ref="LoginUrlAuthenticationEntryPoint">
  <form-login login-page="/Login.html" always-use-default-target="true" default-target-url="/Main.html?gwt.codesvr=127.0.0.1:9997" />
  <intercept-url pattern="/Login.html" access="permitAll()" />
  <intercept-url pattern="/Login2.html" access="permitAll()" />
  <intercept-url pattern="/MyAppName/**" access="permitAll()" />
  <intercept-url pattern="/**" access="isAuthenticated()" />
  <logout delete-cookies="JSESSIONID" logout-success-url="/Login.html" />
  <remember-me token-validity-seconds="86400" key="key" user-service-ref="userDetailsService" />
</http>

按照我获得的示例,我将 AspectJ 用于全局方法安全性,但如果我可以使其正常工作,则不会使用它:

<global-method-security secured-annotations="enabled" pre-post-annotations="enabled" mode="aspectj" proxy-target-class="true" >
  <expression-handler ref="expressionHandler"/>
</global-method-security>

感谢您抽出宝贵时间阅读本文

如果需要更多细节,请告诉我。

【问题讨论】:

我认为您需要将其进一步精简为易于管理的内容,没有多少人会费心阅读所有文本以试图找出问题所在。 感谢您的评论。我试图删除 3 个成功调用中的 2 个的日志,因为它们可能是多余的。 【参考方案1】:

这个问题已经解决了。

解决方案的最后一部分是删除将 SecurityContextHolder 设为全局的请求。

如果您遇到同样的问题,可能会发现 this 的帖子很有帮助。

【讨论】:

您是如何实际解决问题的?我有同样的问题。我浏览了链接,但没有帮助。 @Tiny 在尝试使两因素身份验证正常工作时,我将 SecurityContextHolder 设置为全局,因此删除它为我解决了问题,但可能有很多事情导致了问题。此外,我没有收到 Luke 的回复,说明为什么这会导致我遇到的问题。

以上是关于Spring Method Level Security 在第二次调用时失败的主要内容,如果未能解决你的问题,请参考以下文章

Level-Set Method

图像噪声水平估计——An Efficient Statistical Method for Image Noise Level Estimation

Spring Boot 单元测试忽略 logging.level

Enterprise-level Spring-探索Spring-从入门到入厂

Spring Boot application.yaml中多个默认环境变量的语法

在Junit 5测试中注入Spring数据存储库