acegi_使用Acegi Security保护Grails应用程序的安全

acegi

目录
简介 设置RaceTrack示例应用程序 安装Grails Acegi插件 创建Acegi Security组件 配置Acegi Security以保护应用程序安全 测试

介绍

本文讨论了grails-acegi插件与示例Grails应用程序的集成。 作为此集成的一部分,将使用三个主要组件-GroovyGrailsAcegi Security

Groovy是用于Java平台的功能强大的高级语言,可编译为Java字节码。 它的概念与Ruby或Python类似,但是与Java平台紧密集成。 这使您可以利用功能强大且简洁的编码语法,同时允许您停留在JVM上并保护对现有Java平台和周围库的投资。

Grails是用Groovy实现的完整堆栈框架。 Grails试图通过Grails核心技术和相关的插件来解决许多Web开发难题。 开箱即用的功能包括:

  • 基于Hibernate的对象/关系映射(ORM)层
  • 一种名为Groovy Server Pages(GSP)的表达性视图技术
  • 基于Spring MVC构建的控制器层
  • 基于Gant构建的命令行脚本环境, Gant是基于Groovy的Ant版本
  • 嵌入式Jetty容器,配置用于即时重新加载资源
  • 通过内置的Spring容器进行依赖注入
  • 通过Spring的MessageSource API构建的对国际化(i18n)的支持
  • 利用Spring事务管理的事务服务层
  • 领域特定语言(DSL)的广泛使用

Acegi Security是用于企业软件的功能强大,灵活的安全解决方案,特别强调使用Spring的应用程序。 Acegi提供了全面的身份验证,授权,基于实例的访问控制,通道安全性和人类用户检测功能。

本文假设您已完成Jason Rudolph撰写的Grails 入门中的Grails教程,并且已实现RaceTrack示例应用程序。 然后,grails-acegi插件将与RaceTrack集成在一起,以为您的应用程序提供安全性。 使用grails-acegi插件避免了必须在应用程序中实现Grails拦截器的开销,比拦截器提供了更大的灵活性,并且还通过利用Acegi节省了重新实现自己的安全系统的麻烦。

设置RaceTrack示例应用程序

首先,您需要下载Grails 1.0grails-acegi-0.2插件Java SE JDK 5.0或更高版本。

此时,假设您已经实现了大多数RaceTrack应用程序,如Grails入门中所述。 但是,您不必完成整个教程即可测试grails-acegi插件-所需的只是域类和控制器,而控制器的支架足以进行测试。

图1-创建racetrack应用程序后的目录结构

图1 –创建racetrack应用程序后的目录结构

RaceTrack应用程序目录应类似于上图1所示。 现在,打开\ grails-app \ domain文件夹:

图2-域类目录

图2 –域类目录

如图2所示,“ domain”目录仅包含2个域类:Race和Registration。 现在,打开\ grails-app \ controllers文件夹,并确认它具有每个域类的控制器,如下图3所示:

图3-控制器目录

图3 –控制器目录

这些控制器可以是空的脚手架控制器,例如:

class RaceController { def scaffold = Race }

class RegistrationController { def scaffold = Registration }

这足以使应用程序启动并运行。 启动RaceTrack应用程序之后,您应该能够看到在控制器列表中创建的2个控制器,如下图4所示:

图4-Grails-Acegi插件之前的索引页面

图4 – Grails-Acegi插件之前的索引页面

安装Grails Acegi插件

接下来是grails-acegi插件的安装,以便RaceTrack可以利用该插件提供的基于角色的安全性。 在命令提示符下,导航到“ racetrack”目录并运行以下命令:

grails install-plugin [path-to]/grails-acegi-0.2.zip

此命令在“ racetrack”目录下创建一个插件目录,如下图5所示:

图5-安装插件后创建的plugins目录

图5 –安装插件后创建的plugins目录

创建Acegi Security组件

下一步是创建将代表用户帐户和角色的域类。 要开始此过程,请运行以下命令:

grails create-auth-domains AuthUser Role

这将创建两个域类(AuthUser和Role),设置AcegiConfig类,并创建Login和Logout控制器。 AuthUser域类将代表您的用户,因此,对于每个新用户,都将在Auth_User表中创建一条新记录。 角色域类将表示允许每个用户拥有的安全角色-角色将分配给AuthUsers。 这两个类都显示在下面的图6中。

AcegiConfig类(图7)定义了应用程序的安全性配置。 它包含用户域类(在此例中为AuthUser)和角色域类(在此例中为Role)的名称,是否使用动态或静态安全URL,以及如何设置电子邮件警报(将其关闭或打开)。 。

图6-AuthUser.groovy,Role.groovy和Requestmap.groovy(在AcegiConfig中使用)

图6 – AuthUser.groovy,Role.groovy和Requestmap.groovy(在AcegiConfig中使用)

图7-创建的AcegiConfig.groovy

图7 –创建的AcegiConfig.groovy

为了创建新的AuthUser,创建新的角色并将角色分配给AuthUser,我们将必须运行两个命令。 一个将为域生成CRUD控件:

grails generate-manager

第二个为控制器和域生成注册:

grails generate-registration

这些命令使用户能够注册和创建其用户名和密码,并且默认的安全角色将分配给该用户。 生成的控制器集可以在下面的图8中看到:

图8-CRUD控制器(在创建Auth和Role域时创建登录和注销控制器)

图8 – CRUD控制器(在创建Auth和Role域时创建登录和注销控制器)

图9-安装grails-acegi-plugin后可用的控制器

图9 –安装grails-acegi-plugin后可用的控制器

转到RaceTrack主页-它应类似于上面的图9。

配置Acegi Security以保护应用程序安全

现在,我们将创建一个User角色和一个Manager角色–为此,首先单击RoleController,然后输入“ user”的角色名称和某种角色描述(图10)。 请注意,RoleController将负责将“用户”转换为“ ROLE_USER”,这是数据库中以及Acegi的配置所称的名称。 重复相同的步骤以创建管理员角色。

图10-创建用户角色

图10 –创建用户角色

返回首页,然后单击UserController。 现在,创建一个具有“用户”角色的用户,以及另一个具有“管理者”角色的用户,如下面的图11所示:

图11-创建一个标准用户,启用该帐户并分配“用户”角色

图11 –创建一个标准用户,启用该帐户并分配“用户”角色

现在,我们的角色和用户已经足够配置,因此下一步是保护RaceTrack应用程序。 有两种方法可以确保URL的安全:一种是通过RequestmapController动态地进行,另一种是通过直接编辑AcegiConfig.groovy文件。 动态配置是推荐的选择,因此我们将继续进行。

在保护应用程序安全之前,我们需要考虑应用程序中应该存在的访问规则。 允许管理员对应用程序中的任何页面进行读写访问,这意味着:

  • /race/*
  • /registration/*

允许用户以只读方式访问某些页面,包括:

  • /race/list/*
  • /race/show/*
  • /registration/list/*
  • /registration/show/*

现在,需要使用RequestmapController将这些规则转换为Acegi请求映射中的条目。 在RaceTrack主页上,单击RequestmapController,然后转到“创建新的requestmap”页面。 在URL字段中输入“ / race / **”,在Role字段中输入“ manager”(图12)–这将创建一个规则,该规则允许具有管理员角色的任何用户访问/ race下的所有URL。 进行相同的注册(URL:/ registration / **)。

图12-管理者访问规则

图12 –管理员访问规则

值得注意的是,一个好的做法是也将所有用户权限授予管理员角色。 接下来,将创建用户角色的访问规则-在URL字段中输入“ / race / list / **”,在Role字段中输入“ user,manager”(图13-注意,角色用逗号)。 这将创建一个访问规则,使用户和管理员都可以访问比赛列表页面。 请注意,您将需要指定两个角色-如果仅将此URL分配给用户角色,它将覆盖先前的manager规则,并且仅允许用户角色访问页面。 对先前定义的其余规则重复上一步-这将为比赛和注册页面创建所有访问规则。

图13-为/ race / list / **页面创建规则-授予用户和管理员访问权限

图13 –为/ race / list / **页面创建规则–授予用户和管理员访问权限

测试中

在RaceTrack主页上,单击RaceController或RegistrationController(用于确保视图安全的控制器)。 现在,您会注意到您已自动重定向到“登录”页面。 如果您首先以具有管理员角色的用户身份登录,请注意,您将能够在比赛和注册页面上查看,创建,更新和删除任何内容。

图14-以用户身份登录

图14 –以用户身份登录

返回RaceTrack主页并单击LogoutController-这将使您的用户会话无效并注销您。 再次单击LoginController,但这一次以具有用户角色的用户身份登录。如果您随后转到/ race / list子页面(直接访问http:// localhost:8080 / racetrack / race / list或通过在控制器界面中导航),您应该能够看到race / list视图(图15)。

请记住,访问规则仅允许管理员创建新记录,并且用户只能通过“列表”和“显示”视图读取数据–这意味着,如果您尝试单击“新建种族”( http:// localhost:8080 / racetrack / race /创造 ),而与用户角色的用户登录一样,Acegi将阻止你浏览该页面,防止产生新的纪录。

这是如何运作的? 回想一下,我们向经理授予了对/ race / *的访问权限,但仅向用户授予了对/ race / list / *和/ race / show / *的访问权限。 当具有“用户”角色的用户尝试访问/ race / create页面时,Acegi会查看该用户的角色集,并发现他们仅具有“用户”角色-因为我们的请求映射说该用户必须具有授予该页面访问权限的“经理”角色,但拒绝访问该页面的权限。

附带说明一下,在实际的应用程序中,您可能希望显示比默认页面更好的错误页面(图16)。

图15-竞赛列表视图

图15 –竞赛列表视图

图16-访问被拒绝错误页面

图16 –访问被拒绝错误页面

恭喜–您现在拥有RaceTrack应用程序的完全安全实例!

翻译自: https://www.infoq.com/articles/grails-acegi-integration/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

acegi

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值