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

时间:2013-10-06 07:38:37

标签: spring spring-security

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

我使用自定义UserDetails和AuthenticationProvider来调整授予的权限(here),但是作为已检查的源代码和文档,关于如何自定义权限比较,我发现有一个过滤器SecurityContextHolderAwareRequestWrapper),它实现了isGranted和isUserInRole比较权限,而文件说使用AccessDecisionManager选民来定制(据我所知)。应该使用哪一个?我有控制器和方法(动作)名称来比较权限吗?

我对Spring的安全性感到困惑。是否还有其他资源,而不是官方文档,说明它是如何工作的,我的意思是行动和方法的序列以及如何定制它们。

1 个答案:

答案 0 :(得分:11)

有几种方法:

  1. 基于角色,您为每个用户分配一个角色并在继续之前检查角色
  2. 使用Spring安全表达式
  3. 还有一个新的spring acl组件,它允许您在类级别上执行acl控制并存储在数据库中。 到目前为止,我的个人用法是1和2,您只需为用户分配角色。 但是选项3允许您创建更精细的安全模型,而无需在编写安全模型时重建您的Web应用程序
  4. 基于角色

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

    要了解如何实现这样的项目,请查看以下教程:

    • 使用内存用户数据库Link
    • 进行基于表单的登录
    • 使用自定义用户详细信息服务Link
    • 进行基于表单的登录

    简而言之,Spring安全性在幕后执行以下操作:

    1. 在验证(例如,提交登录表单)时,会创建一个包含登录凭据的验证对象。例如,UsernamePasswordAuthenticationFilter会创建UsernamePasswordAuthenticationToken
    2. 身份验证对象传递给AuthenticationManager,可以将其视为身份验证过程中的控制器。默认实现是ProviderManager
    3. AuthenticationManager通过AuthenticationProvider执行身份验证。使用的默认实现是DaoAuthenticationProvider
    4. DaoAuthenticationProvider通过从UserDetails检索UserDetailsService来执行身份验证。 UserDetails可以被认为是一个数据对象,它包含用户凭据,但也包含用户的权限/角色! DaoAuthenticationProvider通过其loadUserByUsername方法检索凭据 然后将其与提供的UsernamePasswordAuthenticationToken进行比较。
    5. UserDetailsS​​ervice收集用户凭据,权限并从中构建UserDetails对象。例如,您可以从数据库中检索密码哈希和权限。配置网站网址时,您可以参考访问权限attribute中的权限。此外,您可以通过SecurityContextHolder.getContext()。getAuthentication()检索控制器类中的Authentication对象。
    6. 为了更好地理解这些类的内部工作原理,您可以阅读javadoc:

      <强> SpeI位

      SPEL使您无需检查权限,也可以检查用户的其他属性。 您可以在URL模式中使用这些,但也可以使用@Preauthorize注释方法。 这样可以减少对业务层的保护。

      基于ACL

      基于ACL的模型是在spring security 3.0中引入的,但效果不佳documented。 他们的建议是查看Contacts XML example,因为这个使用了新的acl组件。

      上次this book包含有关如何进一步自定义安全愿望的很好示例。