acegi
目录
简介 设置RaceTrack示例应用程序 安装Grails Acegi插件 创建Acegi Security组件 配置Acegi Security以保护应用程序安全 测试介绍
本文讨论了grails-acegi插件与示例Grails应用程序的集成。 作为此集成的一部分,将使用三个主要组件-Groovy , Grails和Acegi 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.0 , grails-acegi-0.2插件和Java SE JDK 5.0或更高版本。
此时,假设您已经实现了大多数RaceTrack应用程序,如Grails入门中所述。 但是,您不必完成整个教程即可测试grails-acegi插件-所需的只是域类和控制器,而控制器的支架足以进行测试。
图1 –创建racetrack应用程序后的目录结构
RaceTrack应用程序目录应类似于上图1所示。 现在,打开\ grails-app \ domain文件夹:
图2 –域类目录
如图2所示,“ domain”目录仅包含2个域类:Race和Registration。 现在,打开\ grails-app \ controllers文件夹,并确认它具有每个域类的控制器,如下图3所示:
图3 –控制器目录
这些控制器可以是空的脚手架控制器,例如:
class RaceController { def scaffold = Race }
class RegistrationController { def scaffold = Registration }
这足以使应用程序启动并运行。 启动RaceTrack应用程序之后,您应该能够看到在控制器列表中创建的2个控制器,如下图4所示:
图4 – Grails-Acegi插件之前的索引页面
安装Grails Acegi插件
接下来是grails-acegi插件的安装,以便RaceTrack可以利用该插件提供的基于角色的安全性。 在命令提示符下,导航到“ racetrack”目录并运行以下命令:
grails install-plugin [path-to]/grails-acegi-0.2.zip
此命令在“ racetrack”目录下创建一个插件目录,如下图5所示:
图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中使用)
图7 –创建的AcegiConfig.groovy
为了创建新的AuthUser,创建新的角色并将角色分配给AuthUser,我们将必须运行两个命令。 一个将为域生成CRUD控件:
grails generate-manager
第二个为控制器和域生成注册:
grails generate-registration
这些命令使用户能够注册和创建其用户名和密码,并且默认的安全角色将分配给该用户。 生成的控制器集可以在下面的图8中看到:
图8 – CRUD控制器(在创建Auth和Role域时创建登录和注销控制器)
图9 –安装grails-acegi-plugin后可用的控制器
转到RaceTrack主页-它应类似于上面的图9。
配置Acegi Security以保护应用程序安全
现在,我们将创建一个User角色和一个Manager角色–为此,首先单击RoleController,然后输入“ user”的角色名称和某种角色描述(图10)。 请注意,RoleController将负责将“用户”转换为“ ROLE_USER”,这是数据库中以及Acegi的配置所称的名称。 重复相同的步骤以创建管理员角色。
图10 –创建用户角色
返回首页,然后单击UserController。 现在,创建一个具有“用户”角色的用户,以及另一个具有“管理者”角色的用户,如下面的图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 –管理员访问规则
值得注意的是,一个好的做法是也将所有用户权限授予管理员角色。 接下来,将创建用户角色的访问规则-在URL字段中输入“ / race / list / **”,在Role字段中输入“ user,manager”(图13-注意,角色用逗号)。 这将创建一个访问规则,使用户和管理员都可以访问比赛列表页面。 请注意,您将需要指定两个角色-如果仅将此URL分配给用户角色,它将覆盖先前的manager规则,并且仅允许用户角色访问页面。 对先前定义的其余规则重复上一步-这将为比赛和注册页面创建所有访问规则。
图13 –为/ race / list / **页面创建规则–授予用户和管理员访问权限
测试中
在RaceTrack主页上,单击RaceController或RegistrationController(用于确保视图安全的控制器)。 现在,您会注意到您已自动重定向到“登录”页面。 如果您首先以具有管理员角色的用户身份登录,请注意,您将能够在比赛和注册页面上查看,创建,更新和删除任何内容。
图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 –竞赛列表视图
图16 –访问被拒绝错误页面
恭喜–您现在拥有RaceTrack应用程序的完全安全实例!
acegi