java - spring security中的手动认证逻辑应该去哪里——服务层还是表现层?

标签 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);

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

提前致谢。

最佳答案

引用Luke Taylor对问题Best practice for getting active user's UserDetails?的回答用于创建自定义接口(interface)来执行此类操作的设计原理,同时使您的代码与 Spring Security 分离。例如,您可以编写一个名为 MyAuthenticator 的接口(interface)并编写实现并将其注入(inject)到您的应用程序中。

此外,如果您的 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),因为它可能会在框架的 future 版本中发生变化。

关于java - spring security中的手动认证逻辑应该去哪里——服务层还是表现层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15484139/

相关文章:

spring - JHipster:CORS 在表单登录时失败(实际请求,不是飞行前)

java - Webfont 提供在表单帖子上下载

java - token "assert"出现语法错误,VariableDeclaratorId 无效

java - 没有 persist() 指令的 JPA 持久实体

spring - 比较 JAX-RS 和 Spring Rest 服务

java - 如何将java中的值传递到查询cassandra数据库

android - Spring Boot 同时处理 http 和 HTTPS 请求

java - Android 强制关闭浏览器或以编程方式重置它

Java HTTP 响应代码 200,而它应该是 301

java - Android 设备上的 IndexOutOfBoundsException 错误不在模拟器上