Почему вход в Spring3 Security может работать только один раз, пока сервер не будет перезагружен? - PullRequest
0 голосов
/ 25 октября 2011

При первом входе в приложение Spring Security все работает как шарм. Но после первого выхода из системы я не могу войти снова, пока служба не будет перезапущена! Кроме того, похоже, что вход в систему прошел успешно, так как я вижу, что пользовательские данные загружаются в hibernate sql-log.

Вот соответствующие фрагменты кода: ApplicationContext-security.xml:

<global-method-security pre-post-annotations="enabled" />
<http auto-config="true" use-expressions="true" security="none" pattern="/bookmark/add" />

<http auto-config="true"
      use-expressions="true"
      access-denied-page="/user/login"
      disable-url-rewriting="true">
    <intercept-url pattern="/dashboard/**" access="isAuthenticated()" />
    <intercept-url pattern="/user/**" access="permitAll" />
    <intercept-url pattern="/**" access="permitAll" />

    <form-login
            default-target-url="/dashboard"
            login-page="/user/login"
            login-processing-url="/user/doLogin"
            authentication-failure-url="/user/login/error"
            username-parameter="email"
            password-parameter="password" />

    <logout logout-success-url="/user/logout"
            logout-url="/user/doLogout"
            invalidate-session="true"
            delete-cookies="true" />

    <remember-me services-ref="rememberMeServices" key="myfancysalt" />

    <session-management invalid-session-url="/user/login">
        <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
    </session-management>
</http>

<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="loginUserDetailsService">
        <password-encoder ref="passwordEncoder" hash="sha-256">
            <salt-source system-wide="myfancysalt" />
        </password-encoder>
    </authentication-provider>
</authentication-manager>

<beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder" />

<beans:bean id="rememberMeFilter" class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">
    <beans:property name="rememberMeServices" ref="rememberMeServices"/>
    <beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>

<beans:bean id="rememberMeServices" class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
    <beans:property name="userDetailsService" ref="loginUserDetailsService"/>
    <beans:property name="key" value="myfancysalt"/>
</beans:bean>

<beans:bean id="rememberMeAuthenticationProvider" class="org.springframework.security.authentication.RememberMeAuthenticationProvider">
    <beans:property name="key" value="myfancysalt"/>
</beans:bean>

LoginController:

@RequestMapping(value = "login", method = RequestMethod.GET)
public String login(Principal principal) {
    if (principal != null) { // If user is already logged in, redirect him
        return "redirect:/dashboard";
    }
    return "user/login";
}

@RequestMapping(value = {"login/error", "/user/doLogin"})
public ModelAndView processLogin(Principal principal) {
    if (principal != null) { // If user is already logged in, redirect him
        return new ModelAndView("redirect:/dashboard", null);
    }
    HashMap map = new HashMap();
    map.put("error", true);

    return new ModelAndView("user/login", map);
}

@RequestMapping(value = "logout")
public ModelAndView logout() {
    return new ModelAndView("user/logout");
}

Необходимый фильтр в web.xml присутствует.

Любая помощь очень ценится!

### EDIT ### :

Проблема заключается в ограничении одновременного сеанса. После того, как я удалил следующую часть из applicationcontext-security.xml, все работает нормально. Может кто-нибудь сказать мне, что с ним не так? (Я просто скопировал / вставил его из некоторого руководства).

<session-management invalid-session-url="/user/login">
    <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</session-management>

1 Ответ

0 голосов
/ 26 октября 2011

Можно попробовать сделать:

principal == null

перед выходом из системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...