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

Omi*_*mid 9 spring spring-security

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

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

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

Nil*_*ils 12

有几种方法:

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

基于角色

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

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

  • 基于表单的登录与内存用户数据库链接
  • 基于表单的登录与自定义用户详细信息服务链接

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

  1. 在验证(例如,提交登录表单)时,创建用于保存登录凭证的验证对象.例如,UsernamePasswordAuthenticationFilter创建UsernamePasswordAuthenticationToken
  2. 身份验证对象将传递给AuthenticationManager,可以将其视为身份验证过程中的控制器.默认实现是ProviderManager
  3. AuthenticationManager通过AuthenticationProvider执行身份验证.使用的默认实现是DaoAuthenticationProvider.
  4. DaoAuthenticationProvider通过从UserDetailsS​​ervice检索UserDetails来执行身份验证.UserDetails可以被认为是一个数据对象,它包含用户凭据,但也包含用户的权限/角色!DaoAuthenticationProvider通过其loadUserByUsername方法检索凭据,然后将其与提供的UsernamePasswordAuthenticationToken进行比较.
  5. UserDetailsS​​ervice收集用户凭据,权限并从中构建UserDetails对象.例如,您可以从数据库中检索密码哈希和权限.配置网站URL模式时,您可以参考access 属性中的权限.此外,您可以通过SecurityContextHolder.getContext().getAuthentication()检索控制器类中的Authentication对象.

为了更好地理解这些类的内部工作原理,您可以阅读javadoc:

SPEL

SPEL不是检查权限,而是还允许您检查用户的其他属性.您可以在URL模式中使用这些,但也可以使用@Preauthorize注释方法.这样保护业务层的方式不那么具有侵入性.

基于ACL

基于ACL的模型是在spring security 3.0中引入的,但尚未有详细记录.他们的建议是查看Contacts XML示例,因为这个示例使用了新的acl组件.

最后,本书包含有关如何进一步自定义安全愿望的很好示例.