我有这段代码
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坏的服务层。 我不确定将认证逻辑放在表示层中有多好。有任何见解的人吗?
提前致谢。
答案 0 :(得分:14)
请参阅Luke Taylor对问题Best practice for getting active user's 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
),因为它可能会在未来版本的框架中发生变化。