Java Spring Security-指定哪个X509可以访问哪个特定端点

Java Spring Security-指定哪个X509可以访问哪个特定端点,java,spring-boot,spring-security,Java,Spring Boot,Spring Security,关于如何使用Spring安全性来指定哪个客户端证书可以访问哪个特定的预定义端点的小问题,请回答 通过预定义端点,我的意思是web应用程序具有默认端点(不是我通过@RestController定义的端点),例如执行器端点/exactor/health,/exactor/prometheus,或者Spring Cloud配置端点,例如/Config/myservice/,不可能进行@预授权 我只想指定哪个客户端证书可以访问哪个端点,例如: 具有UID=Alice的客户端证书可以访问/exactor

关于如何使用Spring安全性来指定哪个客户端证书可以访问哪个特定的预定义端点的小问题,请回答

通过预定义端点,我的意思是web应用程序具有默认端点(不是我通过@RestController定义的端点),例如执行器端点
/exactor/health
/exactor/prometheus
,或者Spring Cloud配置端点,例如
/Config/myservice/
,不可能进行
@预授权

我只想指定哪个客户端证书可以访问哪个端点,例如:

  • 具有
    UID=Alice
    的客户端证书可以访问
    /exactor/health
    /config/myservice
  • 具有
    UID=Bob
    的客户端证书可以访问
    /exactor/prometheus
网上有许多示例,
如何提取X509证书

但是如何在应用程序中配置它,即,哪一个证书可以访问什么的这种映射


谢谢

@Setu为您提供了解决问题的基本信息

请考虑下面的代码,与你所引用的代码相适应:

@springboot应用程序
@启用Web安全性
@EnableGlobalMethodSecurity(Prespenabled=true)
公共类X509AuthenticationServer扩展了WebSecurity配置适配器{
...
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http
.授权请求()
//定义不同端点之间的映射
//以及相应的用户角色
.antMatchers(“/执行机构/健康”).hasRole(“执行机构/健康”)
.antMatchers(“/促动器/普罗米修斯”).hasRole(“促动器/普罗米修斯”)
.antMatchers(“/config/myservice”).hasRole(“config\u myservice”)
//请根据需要调整后备方案
.anyRequest().authenticated()
.及()
//配置X509Configurer(https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/config/annotation/web/configurers/X509Configurer.html)
.x509()
.subjectPrincipalRegex(“CN=(.*?(:,|$)”)
.userDetailsService(userDetailsService())
;
}
@豆子
公共用户详细信息服务用户详细信息服务(){
//理想情况下,这些信息将从数据库或其他数据库中获得
//配置信息
返回新的UserDetailsService(){
@凌驾
公共用户详细信息loadUserByUsername(字符串用户名){
Objects.requirennull(用户名);
列表权限=空;
交换机(用户名){
//匹配不同的X509证书CNs。也许您可以使用
//X509要在中包含角色的证书使用者可分辨名称
//某种方法,并直接使用subjectPrincipalRegex获得它
案件“Alice”:
权威机构
.commaSeparatedStringToAuthorityList(“角色、执行器、运行状况、角色、配置、我的服务”);
打破
案例“Bob”:
权威机构
.commaSeparatedStringToAuthorityList(“角色、执行者、普罗米修斯”);
打破
违约:
抛出新的UsernameNotFoundException(String.format(“未找到用户“%s!”,用户名));
}
返回新用户(用户名“”,权限);
}
};
}
}

请根据您的实际端点和用户需要调整代码。

您是否有用户存储区,可以在
userdetails服务
中查找经过身份验证的用户的详细信息?如果是,则只需在数据库或文件系统中的某个位置进行用户名到角色的映射,然后在
UserDetailsService.loadUserByUsername
方法中为用户分配正确的角色。至于如何保护特定的URL和特定的角色,您可以使用
antMatcher
以及
websecurityConfigureAdapter
中的
hasRole/hasPermission
方法。您好,Setu,谢谢您的评论。不幸的是,没有用户存储。只有在可能的情况下,我希望避免任何类型的数据库交互,并保持解决方案的简单性。即使没有用户存储,原则仍然是一样的。在您的
UserDetailsService.loadUserByUsername
中,有一些if条件检查用户名并为Alice和Bob分配适当的角色,即如果用户名为Alice,则添加角色HEALTH和MYSERVICE else如果用户名为Bob,则添加角色PROMETHEUS。然后在
configure(HttpSecurity http)
方法的
WebSecurityConfigurerAdapter
中定义
antMatchers
hasRole
条件。Spring不会直接提供将特定证书与特定url访问相关联的方法,但使用角色可以实现这一点。也许这个问题会有所帮助。当然,谢谢。我还希望除了如何解析X509(哪个Spring Security可以做得很好),如何定义,哪个证书可以访问什么路由,如果可能的话,我还希望有一个代码片段。谢谢大家欢迎PatPatPat,我很高兴听到答案是有帮助的。