java - Spring 方法级别安全性在第二次调用时失败

标签 java gwt spring-security gwt-rpc

我想在我的 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>

感谢您花时间阅读本文

如果需要更多详细信息,请告诉我。

最佳答案

这个问题已经解决了。

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

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

关于java - Spring 方法级别安全性在第二次调用时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6653548/

相关文章:

java - org.hibernate.hql.ast.QuerySyntaxException : table not mapped

java.util.logging 用 FileHandler 只记录一行信息

java - Spring MVC + Spring Security + JPA 返回 Null ModelAndView 并且不会进行身份验证

java - IntelliJ IDEA 9 CE "Create New Class"对话框 UI 元素用途

java - 重命名 xml 文档中的子节点

java - 如何使用 "external"包中的 GWT UI Binders

tomcat - 是否可以在 "war"目录之外使用 .jar?

java - GWT PhoneGap RPC - 状态异常 0

apache - Apache 和 SSL 背后的 Tomcat

spring - 如何在 Spring Security 4 中实现 AffirmativeBased 对象?