7

我有这段代码

UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(email);
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
SecurityContext securityContext = SecurityContextHolder.getContext();
securityContext.setAuthentication(authentication);
HttpSession session = request.getSession(true);
session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);

这是在 Spring Security 中手动对用户进行身份验证。我的问题是我应该把这段代码放在哪里?把它放在服务层会迫使我将 HttpSession 对象带到服务层,而 AFAIK 是不好的。我也不确定将身份验证逻辑放在表示层中有多好。任何有任何见解的人?

提前致谢。

4

1 回答 1

14

请参阅 Luke Taylor对获取活动用户的 UserDetails 的最佳实践?了解创建自定义接口以执行此类操作同时保持代码与 Spring Security 分离的设计原理。例如,您可以编写一个名为的接口MyAuthenticator并编写实现并将其注入您的应用程序。

此外,如果您的 spring 安全过滤器是标准的,那么您不需要访问 HttpSession 对象。框架过滤器会处理它。您只需在实现中编写以下内容:

UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(email);

Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());

SecurityContextHolder.getContext().setAuthentication(authentication);

我不建议使用“SPRING_SECURITY_CONTEXT”(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY),因为它可能会在框架的未来版本中发生变化。

于 2013-03-18T22:43:12.340 回答