自动在会话中设置对象

时间:2011-03-30 15:25:44

标签: java spring-mvc spring-security

我正在使用spring mvc,spring security和hibernate开发一个Web应用程序。

有没有办法在会话中使用用户凭据自动设置对象?我的意思是,我有当前的代码,我手动将用户对象设置为会话:

@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 :(得分:0)

您可以使用scope = session创建一个bean,该bean将在创建会话时对其进行实例化。见3.4 Bean Scopes

希望这有帮助。

答案 1 :(得分:0)

如果你要将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构建它。

答案 2 :(得分:0)

Spring还提供了HandlerInterceptors,可以为每个请求自动执行,并且只能编程一次。有点像servlet过滤器,但拦截器允许在处理请求之前和之后进行交互。