Установить объект в сессии автоматически - PullRequest
0 голосов
/ 30 марта 2011

Я занимаюсь разработкой веб-приложения с использованием Spring MVC, Spring Security и Hibernate.

Есть ли способ автоматически установить объект в сеансе с учетными данными пользователя ?? Я имею в виду, у меня есть текущий код, в котором я вручную установил объект пользователя для сеанса:

@RequestMapping(value = { "/privados/procesarLogin",
        "/sesiones/procesarLogin" }, method = RequestMethod.GET)
public ModelAndView procesarLogin(HttpServletRequest req) {
    ModelAndView mav = new ModelAndView();
    String usuario = (String) SecurityContextHolder.getContext()
            .getAuthentication().getCredentials();
    Usuario usuarioSesion = us.retornarUsuario(usuario);
    HttpSession sesion = req.getSession(true);
    sesion.setAttribute("usuarioSesion", usuarioSesion);
    mav.setViewName("/privados/principal");
    return mav;
} 

но я выиграл, чтобы создать объект пользователя и автоматически установить его в сеансе после успешной аутентификации его входа в систему. Как мне настроить мой XML-файл? мой текущий:

// заголовок

<global-method-security secured-annotations="enabled" />

<http auto-config="true" access-denied-page="/app/sesiones/procesarLogin">

    <logout logout-success-url="/app/sesiones/login" />
    <form-login authentication-failure-url="/app/sesiones/login?error=true"
        login-page="/app/sesiones/login" default-target-url="/app/sesiones/procesarLogin" />
    <intercept-url pattern="/app/privados/*" access="ROLE_USER" />
</http>

<authentication-manager>
    <authentication-provider>
        <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query="Select usuario, contrasena,true from Usuarios where usuario=?"
            authorities-by-username-query="Select usuario, role from Usuarios where usuario=?" />
        <password-encoder ref="passwordEncoder" />
    </authentication-provider>
</authentication-manager>

<beans:bean id="jasyptPasswordEncryptor"
    class="org.jasypt.util.password.BasicPasswordEncryptor" />

<beans:bean id="passwordEncoder" class="org.jasypt.spring.security3.PasswordEncoder">
    <beans:property name="passwordEncryptor">
        <beans:ref bean="jasyptPasswordEncryptor" />
    </beans:property>
</beans:bean>

Я надеюсь, что ваша помощь Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 02 апреля 2011

Если вы помещаете Usuario объект в сессию, потому что вы хотите использовать его в других методах контроллера (или в других контроллерах), то лучшим и более чистым способом будет ввести его в сам метод следующим образом:

    @RequestMapping(value = { "/privados/procesarLogin",
    "/sesiones/procesarLogin" }, method = RequestMethod.GET)
public ModelAndView procesarLogin(HttpServletRequest req, Usuario usuario) {
/* Use usuario */
... 
}

Для этого вам нужно будет реализовать WebArgumentResolver и зарегистрировать его в AnnotationMethodHandlerAdapter . Перенесите существующий код в resolveArgument метод вашей реализации WebArgumentResolver; то есть сначала проверьте usuario в сеансе, иначе соберите его из SecurityContextHolder.

0 голосов
/ 02 апреля 2011

Spring также предоставляет HandlerInterceptors , который может автоматически выполняться для каждого запроса и программироваться только один раз. Вроде как сервлет-фильтры, но перехватчики позволяют взаимодействовать до и после обработки запроса.

0 голосов
/ 30 марта 2011

Вы можете создать компонент с областью действия = сеанс, который будет создавать его экземпляр при создании сеанса. см. 3,4 Области применения бобов .

Надеюсь, это поможет.

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