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]
具有Person , Authority和Requestmap的示例 :
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种权限:
READ
,WRITE
,CREATE
,DELETE
和ADMINISTRATION
。 您可以根据需要添加自己的权限。 - 标签库(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