весенняя безопасность остается на одном URL при входе - PullRequest
0 голосов
/ 30 декабря 2010

вот мой случай.

когда пользователи впервые попадают на сайт, они будут указывать на страницу входа.(скажем, http://ex.com/), и когда они успешно войдут в систему, они увидят другую страницу с тем же URL-адресом (http://ex.com/

, но когда они откроют сайт на другой вкладке (http://ex.com), онивернуться на страницу входа.

как реализовать этот случай на моем сайте с помощью Spring Security?

это легко сделать при работе с обычным сервлетом. Мне просто нужно иметь 2 метода (doGet для показастраница входа в систему и doPost для аутентификации пользователя, и если он действителен, он вызовет другое представление).

вот моя конфигурация:

<security:http auto-config="true">        
    <security:intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />                
    <security:form-login login-page="/login"
                         login-processing-url="/loginProcess" 
                         default-target-url="/login"
                         authentication-failure-url="/login?login_error=1" />
    <security:logout logout-url="/logout" logout-success-url="/logoutSuccess" />
</security:http>

Ответы [ 2 ]

2 голосов
/ 30 декабря 2010

** Отредактировано (удалить несвязанный ответ)

Похоже, вам необходимо добавить параллельное управление сеансами с помощью Spring Security.См. Следующую ссылку: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/session-mgmt.html

Вы можете ввести SessionRegistry и посмотреть, вошел ли субъект уже в систему.Если он есть, вызовите expireNow ()

. Или вы можете реализовать фильтр на или перед SessionManagementFilter в FilterChainProxy:

SessionManagementFilter проверяет содержимое SecurityContextRepository на текущее содержимоеSecurityContextHolder, чтобы определить, был ли пользователь аутентифицирован во время текущего запроса, обычно с помощью неинтерактивного механизма аутентификации, такого как предварительная аутентификация или запомнить меня [19].Если хранилище содержит контекст безопасности, фильтр ничего не делает.Если этого не происходит, а локальный поток SecurityContext содержит (неанонимный) объект аутентификации, фильтр предполагает, что они были аутентифицированы предыдущим фильтром в стеке.Затем он вызовет настроенную SessionAuthenticationStrategy.- http://static.springsource.org/spring-security/site/docs/3.1.x/reference/session-mgmt.html

1 голос
/ 30 декабря 2010

Я думаю, что ваша конфигурация имеет проблемы

<security:http auto-config="true">        
    <security:intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />                
    <security:form-login login-page="/login"
                         login-processing-url="/loginProcess" 
                         default-target-url="<home-page-url. ex: /home>"
                         authentication-failure-url="/login?login_error=1" />
    <security:logout logout-url="/logout" logout-success-url="/logoutSuccess" />
</security:http>

default-target-url должен указывать на страницу по умолчанию, на которую приложение должно перенаправлять после успешного входа в систему.

EDITED После повторного прохождения требуемой публикации, я думаю, что подход заключается в том, чтобы заставить контроллер обрабатывать /login запрос для обработки обоих случаев

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class AppsController {

    @RequestMapping("/login")
    public ModelAndView view(HttpServletRequest request,
            HttpServletResponse response) {

        Authentication authentication = SecurityContextHolder.getContext()
                .getAuthentication();
        User user = authentication != null
                && authentication.getPrincipal() instanceof User ? (User) authentication
                .getPrincipal() : null;

        return user == null ? getLoginModelAndView() : getHomeModelAndView();
    }

    private ModelAndView getHomeModelAndView() {
        return null;
    }

    private ModelAndView getLoginModelAndView() {
        return null;
    }

}

Если в сеансе нет аутентифицированного пользователя, контроллер вернет страницу входа, но как только пользователь войдет в систему, он вернется на другую страницу.

Spring Security будет кэшировать записи, используемые для пользовательского сеанса, и его можно получить с помощью SecurityContextHolder.

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