在会话中自动设置对象
问题描述:
我正在开发一个使用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>
我希望你的帮助 提前感谢!
答
如果你是把在会议Usuario
对象,因为你想重用它在控制器(或其他控制器)的其他方法,那么更好的和更清洁的方式将注入它的方法本身如下:
@RequestMapping(value = { "/privados/procesarLogin",
"/sesiones/procesarLogin" }, method = RequestMethod.GET)
public ModelAndView procesarLogin(HttpServletRequest req, Usuario usuario) {
/* Use usuario */
...
}
为此,您必须执行WebArgumentResolver并将其注册为AnnotationMethodHandlerAdapter。将您现有的代码转移到您的WebArgumentResolver
实现的resolveArgument
方法;也就是说,首先在会话中检查usuario,否则从SecurityContextHolder
建立它。
我无法回答你的问题,但我在前一天通过spring api查找并发现了DefaultSessionAttributeStore。它允许您设置和删除控制器中的会话中的某些属性,如下所示:public ModelAndView procesarLogin(DefaultSessionAttributeStore status,WebRequest request){... status.storeAttribute(request,attributeName,attributeValue); status.cleanupAttribute(request,attributeName);} – blong824 2011-03-30 15:35:39