spring security中的手动认证逻辑应该放在哪里 – 服务层或表示层?

我有这段代码

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中手动validation用户身份。 我的问题是我应该在哪里放置此代码? 把它放在服务层强迫我把HttpSession对象带到AFAIK坏的服务层。 我不确定将认证逻辑放在表示层中有多好。 任何有见解的人?

提前致谢。

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

此外,如果您的spring安全filter是标准的,那么您不需要访问HttpSession对象。 框架filter将负责处理它。 你必须在你的实现中写下以下内容:

 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 ),因为它可能会在未来版本的框架中发生变化。