gpt4 book ai didi

Spring Security,自定义授权,AccessDecisionManager 与安全过滤器

转载 作者:行者123 更新时间:2023-12-04 03:38:18 26 4
gpt4 key购买 nike

我将基于 ([User<-->Role<-->Right]) 模型实现自定义授权,并且应该将权限与 Controller 和方法名称(例如“ Controller |方法”)进行比较。

我使用自定义 UserDetails 和 AuthenticationProvider 来调整授予的权限( here ),但是在检查有关如何自定义权限比较的源代码和文档时,我发现有一个过滤器 SecurityContextHolderAwareRequestWrapper ) 实现 isGranted 和 isUserInRole 来比较权限,而文档说使用 AccessDecisionManager 投票者进行自定义(据我了解)。应该使用哪一个?我在哪里有 Controller 和方法(操作)名称来与他们比较权限?

我对 Spring 安全性有点困惑。除了官方文档之外,还有其他资源可以说明它是如何工作的,我的意思是 Action 和方法的顺序以及如何自定义它们。

最佳答案

有几种方法:

  • 基于角色,您可以在其中为每个用户分配一个角色并在继续之前检查该角色
  • 使用 Spring 安全表达式
  • 还有一个新的 spring acl 组件,可让您在类级别执行 acl 控制并存储在数据库中。
    到目前为止,我的个人用法是 1 和 2,您只为用户分配角色。
    但是选项 3 允许您创建更细粒度的安全模型,而无需在更改安全模型时重新构建您的 webapp

  • 基于角色

    可以实现基于角色的安全机制,实现 UserDetailsS​​ervice 接口(interface)并配置 spring security 以使用该类。

    要了解如何实现这样的项目,请查看以下教程:
  • 基于内存用户数据库的基于表单的登录Link
  • 使用自定义用户详细信息服务的基于表单的登录 Link

  • 简而言之,spring security 在幕后执行以下操作:
  • 在进行身份验证(例如提交登录表单)后,将创建一个包含登录凭据的身份验证对象。例如 UsernamePasswordAuthenticationFilter创建一个 UsernamePasswordAuthenticationToken
  • 身份验证对象被传递给 AuthenticationManager ,可以认为是认证过程中的 Controller 。默认实现是 ProviderManager
  • AuthenticationManager 通过 AuthenticationProvider 执行身份验证。 .使用的默认实现是 DaoAuthenticationProvider .
  • DaoAuthenticationProvider 通过检索 UserDetails 来执行身份验证。来自 UserDetailsService . UserDetails 可以被认为是一个数据对象,其中包含用户凭据,还包含用户的权限/角色! DaoAuthenticationProvider 通过其 loadUserByUsername 检索凭据。方法
    然后将其与提供的 UsernamePasswordAuthenticationToken 进行比较。
  • UserDetailsS​​ervice 收集用户凭据、权限并从中构建一个 UserDetails 对象。例如,您可以从数据库中检索密码哈希和权限。配置网站 url-patterns 时可以引用访问权限attribute .此外,您可以通过 SecurityContextHolder.getContext().getAuthentication() 在 Controller 类中检索 Authentication 对象。

  • 此外,为了更好地了解这些类的内部工作原理,您可以阅读 javadocs:
  • UserDetails - 如何存储和访问用户凭据
  • AuthenticationManager.authenticate(..) - 关于如何处理 AuthenticationExceptions 的契约(Contract)
  • UserDetailsService.loadUserByUsername(..) - 联系如何处理用户名查找失败,例如用户不存在

  • 拼写

    SPEL 而不是检查当局使您还可以检查用户的其他属性。
    您可以在 URL 模式中使用它们,也可以使用 @Preauthorize 注释方法。
    通过这种方式保护业务层的侵入性较小。

    基于 ACL

    spring security 3.0 引入了基于 ACL 的模型,但一直不太好 documented .
    他们的建议是查看 Contacts XML example ,因为这个使用了他们的新 acl 组件。

    最后 this book包含有关如何进一步定制您的安全愿望的很好的示例。

    关于Spring Security,自定义授权,AccessDecisionManager 与安全过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19206535/

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