基于 SAML 断言的 SAML2 身份验证和授权

2023-12-22

我在用着spring-security-saml2-service-provider针对 SAML IdP 验证我的 SpringBoot Web 应用程序 - 这有效。我还可以使用 REST 控制器访问 SAML 断言@AuthenticationPrincipal Saml2AuthenticatedPrincipal principal,但我想做的是使用 Saml2AuthenticatedPrincipal 主体中的断言内的值来限制 url 的访问 - 这是 SAML 联盟中释放 eduPersonEntitlement 值的常见方法,并据此决定访问。有人这样做过吗?我对此的所有研究/试验都一无所获。 这是我到目前为止所拥有的:

@EnableWebSecurity
public class SAMLSecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
RelyingPartyRegistrationRepository relyingPartyRegistrationRepository;

protected void configure(HttpSecurity http) throws Exception {

    RelyingPartyRegistrationResolver relyingPartyRegistrationResolver =
    new DefaultRelyingPartyRegistrationResolver(this.relyingPartyRegistrationRepository);

    Saml2MetadataFilter filter = new Saml2MetadataFilter(relyingPartyRegistrationResolver, new OpenSamlMetadataResolver());
    
    http
        .saml2Login(withDefaults())
            .addFilterBefore(filter, Saml2WebSsoAuthenticationFilter.class).antMatcher("/**")
        .authorizeRequests()
            .anyRequest().authenticated();
    }
}

我想我需要换掉authenticated()可能与角色有关,并以某种方式在用户登录时为用户设置角色,但对此毫无进展。有任何想法吗?


好的,开始工作了......您需要自定义 saml2Login - 用新的定制器替换 withDefaults() 方法(下面的 Saml2LoginSettings):

SAMLSecurityconfig.java:

@EnableWebSecurity
public class SAMLSecurityConfig extends WebSecurityConfigurerAdapter {
  
    @Autowired
    RelyingPartyRegistrationRepository relyingPartyRegistrationRepository;

    @Autowired
    Saml2LoginSettings settings;
    
    protected void configure(HttpSecurity http) throws Exception {

        RelyingPartyRegistrationResolver relyingPartyRegistrationResolver =
        new DefaultRelyingPartyRegistrationResolver(this.relyingPartyRegistrationRepository);

        Saml2MetadataFilter filter = new Saml2MetadataFilter(relyingPartyRegistrationResolver, new OpenSamlMetadataResolver());

        http
            .saml2Login(settings)
                .addFilterBefore(filter, Saml2WebSsoAuthenticationFilter.class).antMatcher("/**")  // 
            .authorizeRequests()
            .antMatchers("/attributes").hasAuthority("ADMIN")
            .anyRequest().authenticated();

使用 Saml2LoginSettings.java:

@Component
class Saml2LoginSettings implements Customizer <Saml2LoginConfigurer<HttpSecurity>> {

    @Override
    public void customize(Saml2LoginConfigurer<HttpSecurity> t) {
   
        t.successHandler(new SavedRequestAwareAuthenticationSuccessHandler() {

            @Override
            public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
                    Authentication authentication) throws IOException, ServletException {

                authentication = assignAuthorities (authentication, request);
                super.onAuthenticationSuccess(request, response, authentication);
            }
        }); 
    }

分配权限有点麻烦,但这是有效的:

    private Authentication assignAuthorities (Authentication authentication, HttpServletRequest request) {
        Collection<SimpleGrantedAuthority> oldAuthorities = (Collection<SimpleGrantedAuthority>)SecurityContextHolder.getContext()
                .getAuthentication().getAuthorities();

        DefaultSaml2AuthenticatedPrincipal princ = (DefaultSaml2AuthenticatedPrincipal) authentication.getPrincipal();
        if (princ.getAttribute("urn:oid:1.3.6.1.4.1.5923.1.1.1.7").contains("urn:mace:dir:entitlement:common-lib-terms")) {

            List<SimpleGrantedAuthority> updatedAuthorities = new ArrayList<SimpleGrantedAuthority>();
            updatedAuthorities.addAll(oldAuthorities);
            updatedAuthorities.add(new SimpleGrantedAuthority("ADMIN"));
            Saml2Authentication sAuth = (Saml2Authentication) authentication;

            sAuth = new Saml2Authentication(
                    (AuthenticatedPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal(),
                    sAuth.getSaml2Response(),
                    updatedAuthorities
            );
            SecurityContextHolder.getContext().setAuthentication(sAuth);

            return sAuth;
        }
        else 
            return authentication;
    }

示例代码here https://github.com/jim-reespotter/SpringBootSAML

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 SAML 断言的 SAML2 身份验证和授权 的相关文章

随机推荐

  • Dotnet Core 3.1:如何使用具有文件绝对路径的 AddJsonFile?

    我有一个 dotnet 应用程序 我需要从两个相对路径 常规路径 中提取配置appsettings Json appsettings Development json 并且还可以从绝对路径 config appsettings json 我
  • 如何在特定时间执行循环

    我如何在指定的时间内执行特定的循环 Timeinsecond 600 int time 0 while Timeinsecond gt time do something here 我如何在这里设置时间变量 如果我可以使用 Timer 对象
  • 检查发件人电子邮件地址

    我的 Outlook 框中有一个 VBA 侦听器 用于在收到来自特定电子邮件的邮件时执行操作 问题是 如果我收到错误邮件 未送达电子邮件 那么我的条件是在不具有该属性的邮件上运行 因此我的方法崩溃 我也不知道主题是什么 有谁知道我是否可以测
  • 泛型 在 C# 中不起作用,即使运行没有任何错误

    我正在使用 Silverlight 5 VS 2010 创建一个 C Web 应用程序 首先 我创建了控制台应用程序 一切正常 但是当我在网络应用程序中执行此操作时会出现问题 即使在网络应用程序中 它对于特定的设置数据类型也能正常工作 例如
  • 旧版本的 spring boot 无法在 Java 11 上启动

    我正在使用 spring boot 应用程序的 1 4 1 RELEASE Java 8 一切正常 但是 当我将 java 版本更新到 11 时 我无法使用命令运行应用程序mvn clean spring boot run 同时我可以打包成
  • 覆盖getter只需要@synthesize

    我想覆盖惰性实例化的 getter 并保留默认的 setter 我需要 synthesize 吗 Why interface Foo property strong nonatomic NSObject bar end implementa
  • 表达式/语句树

    进一步更新问题 我一直在尝试使用 NET 4 中的表达式树在运行时生成代码 并且我一直在尝试实现foreach通过构建表达式树来声明 最后 表达式应该能够生成执行此操作的委托 Action
  • 如何在 git 上执行 3 向视觉差异?

    我想对存在于 2 个不同分支中的单个文件进行 3 路比较 即每个分支中的最后一次提交 并考虑共同的祖先 我想使用一个允许进行三向比较的外部工具 我正在考虑使用 git difftool 但据我所知 它只允许比较给定文件的任何两个版本 我可以
  • 计算嵌套列表中包含特定元素的列表的数量

    我有一个列表 例如 res a b a a b c a 我想计算有多少个列表包含特定字母 例如 a 包含在 3 个列表中 b 包含在 2 个列表中 c 包含在 1 个列表中 下面的代码是我到目前为止所拥有的 count 0 docs a l
  • Visual Studio 2013 的 RC 更新 2 共享项目

    我最近安装了 Visual Studio 2013 的 RC 更新 2 在浏览通用应用程序的模板时 我发现了一个项目 Shared其中有一个扩展 shproj 当我在网上浏览一些材料时 我发现它是一个用于共享代码和文件的项目模板 我认为这很
  • clang-format 正则表达式语法参考

    我希望 clang format 不修改我用来分隔函数的注释行 我认为commentPragmas是正确的选择 但我找不到有关 clang format 正则表达式格式的信息 I tried commentPragmas 捕捉我的分隔线 看
  • 如何在 PHP 中包含其他文件?

    我刚刚开始在家里创建一个网站 当然 我必须有这两个页面才能快速完成我的网站 footer php header php 所以我创建了这些页面并放置了一些内容 还创建了一个索引页作为index php在 的里面htdocs folder 然后
  • 并行运行多个查询动画

    我有两个路由组件及其容器 我已为其设置了动画触发器 slide 其中我查询每个并相应地设置动画 div div
  • 如何检测屏幕脚轮android,检测点击压力

    我开发了一个玩起来很有趣的应用程序 但有一些顽皮的人通过使用不同类型的方式破坏其他人的乐趣屏幕脚轮然后玩弄自动化脚本并欺骗用户 这是一个链接 http code google com p androidscreencast 一位非常著名的屏
  • MagicalRecords 从 JSON / NSDictionary 导入数据。导入关系

    我对人际关系有疑问 我必须使用 NSManagedObject 类 Team 和 Player 团队可以包含许多玩家 玩家只能包含一支球队 以下是两个请求的 JSON team id 1 name Chicago Bulls city Ch
  • Excel VBA 工作簿.ChangeFileAccess

    我在使用 VBA 更改 Excel 工作簿上的文件访问模式时遇到问题 我使用的是 Office 2010 我希望能够适当地在只读和读写模式之间切换 然而 似乎将工作簿从读 写更改为只读 然后再返回 如下面的代码所示 在尝试访问工作簿对象的任
  • XML 两个同名标签

    在我的 XML 文档中 我有两个同名的标签 都称为 item 我现在已经为此文档创建了一个 XML 架构 考虑到我有两个同名的标签 我的 XML 架构准确吗 XML文档
  • 无法在我自己的代码中将 CHOLMOD 与 CUDA 加速一起使用

    我正在尝试使用CHOLMOD with CUDA加速度SuiteSparse 4 4 4 我按照用户指南编译了它 我可以运行gpu sh under Demo文件夹成功 这表明GPU正在做部分工作 但是 当我尝试使用运行我自己的代码时CHO
  • 以编程方式加载 SSIS 包配置

    我正在 SSIS 中制作一个框架 用于从可配置文件夹加载文件并将它们与数据库中的逻辑作业相匹配 在此作业中配置了包名称 并在 SSIS 中我在运行时执行此包 我想根据加载的作业以编程方式加载此包的包配置 SSIS SQL Server 包配
  • 基于 SAML 断言的 SAML2 身份验证和授权

    我在用着spring security saml2 service provider针对 SAML IdP 验证我的 SpringBoot Web 应用程序 这有效 我还可以使用 REST 控制器访问 SAML 断言 Authenticat