Board logo

标题: Apache Shiro 简介(4) [打印本页]

作者: look_w    时间: 2018-9-23 14:03     标题: Apache Shiro 简介(4)

运行一个 Grails web 应用程序您可以使用两种基本技巧将 Shiro 应用到 web 应用程序。首先,您可以使用这个 API 来将这里所展示的的代码并入一个基础 servlet。其次,您可以使用 Shiro 自带的 HTTP 过滤器。本例展示了第二种技巧,因为使用过滤器充分利用了内置 web 应用服务器技术以及来自 Shiro 项目的预先编写好的代码。               
本例显示了如何使用 Grails 内的这些过滤器。Grails 是一个项目,旨在让您通过使用一种惯例优先原则(convention-over-configuration)的方式尽快地编写 Groovy web 应用程序。有关 Grails 的更多信息,请参见 。               
对于 Shiro 过滤器,您通常会手动地向 web.xml 文件添加必需的过滤器项。但是,Grails 会在您每次启动应用程序时生成 web.xml 文件,因此不必手动修改 web.xml。               
幸运的是,Grails 提供了插件,可集成到 web.xml 生成过程并会让您也可以参与在 web.xml 文件内编写这些项。如今,Grails 的可用插件很多,包括面向 Shiro 的这个插件。建议尝试使用这个 Shiro Grails 插件,它提供了几个新的脚本,运行这些脚本可以创建不同的域和控制器。               
或者,如果您更愿意自己添加这些项并进行配置,您也可以编写您自己的插件。对于 Grails,编写一个新的插件很容易。要创建能将必需的 Shiro 过滤器项添加到 web.xml 文件的 Grails 插件,可以使用如下命令:               
1
> grails create-plugin ShiroWebXml




创建了这个插件项目后,编辑 ShiroWebXmlPlugin.groovy 文件,并添加如  所示的代码。                
清单 7. 示例插件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class ShiroWebXmlPlugin {
   
   // snipped plugin details...

   def doWithWebDescriptor = { xml ->

       def filterElement = xml.'filter'
       def lastFilter = filterElement[filterElement.size() - 1]

       lastFilter + {
           'filter' {
               'filter-name'("ShiroFilter")
               'filter-class'("org.apache.shiro.web.servlet.IniShiroFilter")
               'init-param' {
                   'param-name'("config")
                   'param-value'("\n#config")
               }
           }
       }

       def filterMappingElement = xml.'filter-mapping'
       def lastFilterMappingElement =
           filterMappingElement[filterMappingElement.size() - 1]

       lastFilterMappingElement + {
           'filter-mapping' {
               'filter-name'("ShiroFilter")
               'url-pattern'("/*")
               }
           }
       }
}




当 Grails 执行这个 web.xml 文件时,此代码就会运行。
在启动这个插件应用程序测试它之前,先将用 Ivy 下载的 Shiro JAR 文件复制到此插件的 lib 文件夹。有了                         JAR 文件后,用以下命令测试此插件是否能正常工作:               
1
grails run-app




如果此插件应用程序成功启动,您可以将它打包以便用在一个示例项目中。要打包这个插件,使用如下命令:               
1
grails package-plugin




可以用如下命令安装这个新的 ShiroWebXmlPlugin:               
1
2
cd myapp
grails install-plugin /path/to/shiro-web-xml-1.0.zip




故障排除如果出现了 UnavailableSecurityManagerException,那么可能是 SecurityManager 未被正确设置。在调用 getSubject() 方法之前,请确保它设在 SecurityUtils                        对象上。               
连接到 LDAP 服务器可能会有些困难。如果得到一个                        javax.naming.CommunicationException,那么请检查此 LDAP 服务器的主机名和端口。即便您没有使用 Apache                        Directory,Apache Directory Studio(可单独安装)也可以帮助您排除连接故障以及名称问题。               
如果您没有使用 Ant Ivy 脚本来初始化您的环境,那么有可能会得到丢失类的错误。即便没有 Apache Commons                         Logging library (commons-logging),这个 INI 文件示例仍可运行,但是运行这个 LDAP                        示例会导致一个异常。这时,可以使用 Apace Commons BeanUtils                来解析这个 INI 文件并设置对象上的值。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0