Spring Security Web App: другой логин, один и тот же объект аутентификации - PullRequest
1 голос
/ 15 февраля 2012

Я использую Spring Security для организации безопасности и управления пользователями в моем приложении GWT. Если я войду как «admin», выйду из системы и войду как другой пользователь, «SecurityContextHolder.getContext ()» по-прежнему возвращает мне аутентификацию «admin», хотя я использую стандартный URL-адрес выхода из системы безопасности (/ j_spring_security_logout) и после выхода из системы необходимо войти в систему снова для доступа к странице ... у кого-нибудь есть подсказка? Я в конце своих знаний = /

фильтры в моем web.xml:

   <filter>
      <filter-name>springSecurityFilterChain</filter-name>
      <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
   </filter>
   <filter-mapping>
     <filter-name>springSecurityFilterChain</filter-name>
     <url-pattern>/*</url-pattern>
   </filter-mapping>
   <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>

applicationContext.xml:

<bean class="service.security.DefaultPermissionEvaluator" id="permissionEvaluator"/>
<bean class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler" id="expressionHandler">
    <property name="permissionEvaluator" ref="permissionEvaluator"/>
</bean>
<sec:global-method-security pre-post-annotations="enabled">
  <sec:expression-handler ref="expressionHandler"/>
</sec:global-method-security> 
<bean class="service.security.DefaultAuthenticationProvider" id="authenticationProvider"/>
<bean class="service.security.DefaultUserDetailsManager" id="userDetailsManager"/>
<bean class="service.security.DefaultAuthenticationListener" id="customAuthListener"/>
<sec:authentication-manager>
  <sec:authentication-provider ref="authenticationProvider">
  </sec:authentication-provider>
</sec:authentication-manager>     
<sec:http auto-config="true" use-expressions="true">
  <sec:form-login default-target-url="/Index.html" always-use-default-target="true"/>
  <sec:logout invalidate-session="true" logout-success-url="/" logout-url="/j_spring_security_logout"/>
  <sec:intercept-url pattern="/service/admin/**" access="hasRole('ADMIN')"/>
  <sec:intercept-url pattern="/**" access="hasRole('USER')"/>
</sec:http> 

1 Ответ

2 голосов
/ 17 февраля 2012

Проблема заключалась в том, что я сделал это:

class ServiceExample extends HttpServlet {
    private final Authentication auth;
    public ServiceExample() {
        this.auth = SecurityContextHolder.getContext().getAuthentication()
    }

    public User getCurrentUser() {
        return (User) this.auth.getPrincipal();
    }
}

вместо:

class ServiceExample extends HttpServlet {
    public ServiceExample() {
    }

    public User getCurrentUser() {
        return (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    }
}

Что заставляет SecurityContext инициализироваться один раз, когда кто-то входит в систему (поведение Jetty) и не изменяется, когда кто-тоеще регистрирует причину, используя тот же экземпляр ...

...