Spring Level Level Security отказывает при втором вызове - PullRequest
4 голосов
/ 11 июля 2011

Я хочу использовать защиту уровня метода в своем приложении GWT. Я пытаюсь использовать Spring Security 3.1, так как нашел рабочий пример здесь , но он не использует форму входа в систему. После прочтения этого ответа первый вызов метода успешно получает 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>

Спасибо, что нашли время, чтобы прочитать это

Пожалуйста, дайте мне знать, если вам нужно больше деталей.

1 Ответ

0 голосов
/ 15 июля 2011

Эта проблема была решена.

Последняя часть решения состояла в том, чтобы убрать запрос о глобализации SecurityContextHolder.

Если у вас возникла та же проблема, возможно, этот пост будет полезен.

...