具有Spring Security的Grails

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

1. 简介 2. 起步 2.1 下载并安装Grails 2.2 创建一个Grails应用 2.3 Hello World示例 2.4 使用IDE 2.5 规约配置 2.6 运行Grails应用 2.7 测试Grails应用 2.8 部署Grails应用 2.9 所支持的Java EE容器 2.10 创建工件 2.11 生成Grails应用 3. 配置 3.1 基本配置 3.1.1 内置选项 3.1.2 日志 3.2 环境 3.3 数据源 3.3.1 数据源和环境 3.3.2 JNDI数据源 3.3.3 自动数据库移植 3.4 外部配置 3.5 定义版本 4. 命令行 4.1 创建Gant脚本 4.2 可复用的Grails脚本 4.3 脚本中的事件 4.4 Ant和Maven 5. 对象关系映射(GORM) 5.1 快速指南 5.1.1 基本的CRUD 5.2 在GORM中进行领域建模 5.2.1 GORM中的关联 5.2.1.1 一对一 5.2.1.2 一对多 5.2.1.3 多对多 5.2.2 GORM的组合 5.2.3 GORM的继承 5.2.4 集合、列表和映射 5.3 持久化基础 5.3.1 保存和更新 5.3.2 删除对象 5.3.3 级联更新和删除 5.3.4 立即加载和延迟加载 5.3.4 悲观锁和乐观锁 5.4 GORM查询 5.4.1 动态查找器 5.4.2 条件查询 5.4.3 Hibernate查询语言 5.5 高级GORM特性 5.5.1 事件和自动实现时间戳 5.5.2 自定义ORM映射 5.5.2.1 表名和列名 5.5.2.2 缓存策略 5.5.2.3 继承策略 5.5.2.4 自定义数据库标识符 5.5.2.5 复合主键 5.5.2.6 数据库索引 5.5.2.7 乐观锁和版本定义 5.5.2.8 立即加载和延迟加载 5.6 事务编程 5.7 GORM和约束 6. Web层 6.1 控制器 6.1.1 理解控制器和操作 6.1.2 控制器和作用域 6.1.3 模型和视图 6.1.4 重定向和链 6.1.5 控制器拦截器 6.1.6 数据绑定 6.1.7 XML和JSON响应 6.1.8 上传文件 6.1.9 命令对象 6.2 Groovy Server Pages 6.2.1 GSP基础 6.2.1.1 变量和作用域 6.2.1.2 逻辑和迭代 6.2.1.3 页面指令 6.2.1.4 表达式 6.2.2 GSP标签 6.2.2.1 变量和作用域 6.2.2.2 逻辑和迭代 6.2.2.3 搜索和过滤 6.2.2.4 链接和资源 6.2.2.5 表单和字段 6.2.2.6 标签作为方法调用 6.2.3 视图和模板 6.2.4 使用Sitemesh布局 6.3 标签库 6.3.1 简单标签 6.3.2 逻辑标签 6.3.3 迭代标签 6.3.4 标签命名空间 6.4 URL映射 6.4.1 映射到控制器和操作 6.4.2 嵌入式变量 6.4.3 映射到视图 6.4.4 映射到响应代码 6.4.5 映射到HTTP方法 6.4.6 映射通配符 6.4.7 自动重写链接 6.4.8 应用约束 6.5 Web Flow 6.5.1 开始和结束状态 6.5.2 操作状态和视图状态 6.5.3 流执行事件 6.5.4 流的作用域 6.5.5 数据绑定和验证 6.5.6 子流程和会话 6.6 过滤器 6.6.1 应用过滤器 6.6.2 过滤器的类型 6.6.3 过滤器的功能 6.7 Ajax 6.7.1 用Prototype实现Ajax 6.7.1.1 异步链接 6.7.1.2 更新内容 6.7.1.3 异步表单提交 6.7.1.4 Ajax事件 6.7.2 用Dojo实现Ajax 6.7.3 用GWT实现Ajax 6.7.4 服务端的Ajax 6.8 内容协商 7. 验证 7.1 声明约束 7.2 验证约束 7.3 客户端验证 7.4 验证和国际化 8. 服务层 8.1 声明式事务 8.2 服务的作用域 8.3 依赖注入和服务 8.4 使用Java的服务 9. 测试 9.1 单元测试 9.2 集成测试 9.3 功能测试 10. 国际化 10.1 理解信息绑定 10.2 改变Locales 10.3 读取信息 11. 安全 11.1 预防攻击 11.2 字符串的编码和解码 11.3 身份验证 11.4 关于安全的插件 11.4.1 Acegi 11.4.2 JSecurity 12 插件 12.1 创建和安装插件 12.2 理解插件的结构 12.3 提供基础的工件 12.4 评估规约 12.5 参与构建事件 12.6 参与运行时配置 12.7 运行时添加动态方法 12.8 参与自动重载 12.9 理解插件加载的顺序 13. Web服务 13.1 REST 13.2 SOAP 13.3 RSS和Atom 14. GrailsSpring 14.1 Grails的支柱 14.2 配置其他Bean 14.3 通过Beans DSL运行Spring 14.4 配置属性占位 14.5 配置属性重载 15. Grails和Hibernate 15.1 通过Hibernate注释进行映射 15.2 深入了解 16. 脚手架
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值