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

sha*_*ltc 7 java spring 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);
Run Code Online (Sandbox Code Playgroud)

这是在spring security中手动验证用户身份.我的问题是我应该在哪里放置此代码?把它放在服务层强制我将HttpSession对象带到AFAIK不好的服务层.我不确定将认证逻辑放在表示层中有多好.任何有见解的人?

提前致谢.

Rit*_*esh 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);
Run Code Online (Sandbox Code Playgroud)

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