1. Spring Security与Grails集成的概述

Spring Security吹捧了许多身份验证,授权,基于实例的功能以及各种其他功能,这些特性使其对使用安全的应用程序具有极大的吸引力。

考虑到这一点,由于Grails使用了Spring的Inversion of Control Framework和MVC设置,因此开发人员试图使用Spring Security来保护Grails。

这产生了两个值得注意的插件: Spring Security Core插件Spring Security ACL插件

我们将审查这些Spring Security插件的功能,并与将Spring Security用于普通的旧Spring应用程序进行比较。

2. Spring Security Core插件

该插件提供了实用的默认设置以及许多用于自定义的配置选项。

2.1域类

Spring Security Core插件使用默认的Grails域类。 为了对插件使用标准查找,我们至少需要一个Person and Authority域类。

如果要在数据库中存储URL <==>角色映射(这是定义映射的几种方法之一),则需要一个Requestmap域类。 如果我们使用推荐的方法来映射Person和Authority之间的多对多关系,那么我们还需要一个域类来映射联接表。

要使用用户/组查找,我们还需要一个域类。 如果我们使用推荐的方法来映射“ 个人”和“ 组”之间以及“ 组”和“ 授权”之间的多对多关系,则每个域都需要一个域类来映射联接表。 我们仍然可以通过这种方法另外使用Requestmap

我们可以使用s2-quickstart生成域类。 语法非常简单:

grails s2-quickstart DOMAIN_CLASS_PACKAGE USER_CLASS_NAME ROLE_CLASS_NAME [REQUESTMAP_CLASS_NAME] [--groupClassName=GROUP_CLASS_NAME]

具有PersonAuthorityRequestmap的示例

grails s2-quickstart com.ourapp Person Authority Requestmap

2.2配置请求映射以保护URL

我们可以选择以下方法来配置请求映射以保护URL:

我们一次只能使用一种方法。

例如,这里使用@Secured批注和Spring Expression Language(SpEL):

class SecureController {

   @Secured("hasRole('ROLE_USER')")
   def someRandomAction() {
      ...
   }

2.3其他各种功能

Spring Security Core插件的一些各种功能包括:

  • 用于处理较低级别的Spring Security的帮助程序类,例如SecurityTagLib ,它提供GSP标签以基于用户是否通过身份验证和/或具有执行特定操作所需的角色来支持条件显示。
  • 事件–包括事件通知,事件侦听器和回调关闭。
  • 过滤器,包括定义将哪些过滤器应用于不同的URL模式的功能。

3. Spring Security ACL插件

Spring Security ACL插件向使用上述Spring Security Core插件的Grails应用程序添加了域对象安全支持。 因此,我们需要在build.gradle中已有其他插件。

添加域对象安全性支持是什么意思? Spring Security Core插件和其他扩展插件支持通过规则来限制对URL的访问,这些规则包括检查用户的身份验证状态,角色等。ACL插件通过添加对限制访问各个域类实例的支持来扩展此功能。

3.1方法安全性

Spring Security中通常提供的四个注释可与Spring Expression Language(SpEL)表达式一起使用,以执行基于表达式的访问控制 :

  • @PreAuthorize
  • @PreFilter
  • @PostAuthorize
  • @PostFilter

以上注释全部记录在Spring Security文档的“ 方法安全性表达式”部分中。

使用方法安全性的能力是Spring Security ACL插件和Spring Security Core插件之间的非常重要的区别。 如果要实现细粒度的访问控制,则出于这个原因,必须使用Spring Security ACL插件。

值得庆幸的是,除了Groovy和Java之间的语法差异之外,该代码实际上看起来是相同的:

@PreAuthorize("hasRole('ROLE_USER')")
   @PostFilter("hasPermission(filterObject, read) or " +
               "hasPermission(filterObject, admin)")
   List getAllDocs(params = [:]) {
      Report.list(params)
   }

3.2域类

像Spring Security Core插件一样,Spring Security ACL插件使用域类进行适当的结构化。

在这种情况下,域类用于管理数据库状态。 为了与通常基于JDBC的Spring Security代码兼容,将创建域类以生成表名和列名。

该插件中与持久性关联的类使用这些类。 但是,可以通过运行s2-create-acl-domains脚本来覆盖它们:

grails s2-create-acl-domains

因此,该脚本将在应用程序的grails-app/domain文件夹中生成相同的域类,以进行一些自定义。

3.3各种其他功能

Spring Security ACL插件的一些各种功能包括:

  • 身份验证运行替换:这是一个临时身份验证开关,仅持续进行一次方法调用。
  • 自定义权限: BasePermission类提供5种权限: READWRITECREATEDELETEADMINISTRATION 。 您可以根据需要添加自己的权限。
  • 标签库(taglib)用于允许和拒绝。

4。结论

Spring Security Core插件提供了许多非常有用的功能,用于通过Spring Security保护Grails,但是为了实现更复杂,更细粒度的授权,必须结合使用Spring Security ACL插件。

推荐读物: 基于创建者的授权资源(Spring Security)以及我关于Spring框架的文章,以获取有关Spring的一般知识。

翻译自: https://www.javacodegeeks.com/2019/01/grails-spring-security.html