我正在使用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>
我希望你的帮助 提前谢谢!
答案 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过滤器,但拦截器允许在处理请求之前和之后进行交互。