gpt4 book ai didi

Spring 安全 : Why Authentication is extending Principal?

转载 作者:行者123 更新时间:2023-12-04 19:08:50 27 4
gpt4 key购买 nike

Spring Security 假设 Authentication 是 Principal 。

public interface Authentication extends Principal, Serializable {}

HttpServletRequest 有 getUserPrincipal 的方法它负责访问主体对象。

让我们考虑这种情况:
public interface RealPrincipal extends Principal {
public Integer getId();
}

公共(public)模块 A 具有 Real Principal 接口(interface)和实现。

Module A 使用 Common Module A,Servlet Api,不依赖 Spring Security:

Module B 使用 Common Module A、Servlet Api 并配置 Spring Security。该模块负责安全性和 UserDetails 的实现。

Web A 使用模块 A 和模块 B。

为了使用请求方法,我最终得到了这样的实现:
public ModelAndView someRequestHandler(Principal principal) {
User activeUser = (User) ((Authentication) principal).getPrincipal();
...
}

这迫使我对模块 A 和其他模块依赖 Spring Security。我相信一个适当的 servlet api 抽象不应该依赖于 spring 安全性。 request.getUserPrincipal 应该返回真正的委托(delegate)人。

请解释为什么 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper 返回

身份验证而不是 Real Principal .

编辑:我已将通用模块 A 添加到我的场景中,并更新了模块 B 负责安全性。

最佳答案

正如 Luke 所说,Spring Security 对 Principal 使用 Authentication,因为它实现了 Principal。它不使用 Authentication#getPrincipal() 因为它不能保证是 Principal (它是一个对象)。事实上,在大多数情况下,Spring Security 的 Authentication#getPrincipal() 返回一个 User(不实现 Principal)、框架用户提供的自定义 UserDetails 或 String。

如果您希望 Spring Security 处理此问题,您可能需要按照 Luke 的建议使用 HttpServletRequestWrapper 来实现此逻辑。例如,您可以执行以下操作:

public RealPrincipalFilter extends OncePerRequestFilter {

public void doFiter(HttpServletRequest request, HttpServletResponse response, FilterChain) {
chain.doFilter(new RealPrincipalRequestWrapper(request), response);
}

private static final class RealPrincipalRequestWrapper
extends HttpServletRequestWrapper {
public Principal getUserPrincipal() {
Authentication auth = (Authentication) super.getPrincipal();
return auth == null ? null : (RealPrincipal) auth.getPrincipal()
}
}
}

@Configuration
@EnableWebSecurity
public WebSecurityConfig extends WebSecurityConfigurerAdapter {
public configure(HttpSecurity http) {
http
// ... other config ...
.addFilterAfter(new RealPrincipalFilter(), SecurityContextHolderAwareRequestFilter.class);
}
...
}

或者,查看我对您的其他问题的回答,了解与 Spring MVC 集成的选项 - Injecting Custom Principal to Controllers by Spring Security

关于 Spring 安全 : Why Authentication is extending Principal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17744272/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com