9

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

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

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

4

1 回答 1

12

有几种方法:

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

基于角色

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

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

简而言之,spring security 在幕后执行以下操作:

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

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

拼写

除了检查权限之外,SPEL还允许您检查用户的其他属性。您可以在 URL 模式中使用它们,也可以使用 @Preauthorize 注释方法。通过这种方式保护业务层的侵入性较小。

基于 ACL

基于 ACL 的模型是在 spring security 3.0 中引入的,但没有得到很好的记录。他们的建议是查看Contacts XML 示例,因为这个示例使用了他们的新 acl 组件。

最后,本书包含有关如何进一步定制您的安全愿望的精彩示例。

于 2013-10-06T11:32:44.697 回答