Apache Shiro Web应用整合-配置
2016-01-27 16:24
591 查看
博客分类:
Shiro
Shiro
将Shiro 集成到任何 Web 应用程序的最简单的方法是在 web.xml 中配置 ContextListener 和 Filter ,来使 Shiro 知道如何读取 Shiro 的 INI 配置文件。
注意:Spring 框架用户将不执行此设置。如果你使用 Spring ,你将要阅读关于 Spring 特定的 Web 配置。
Web.xml
Shiro 1.2 and later
在Shiro 1.2 及以后版本,标准的 Web 应用程序通过添加下面的 XML 块到 web.xml 来初始化 Shiro :
<listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> … <filter> <filter-name>ShiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> </filter> <filter-mapping> <filter-name>ShiroFilter</filter-name> <url-pattern>*/</url-pattern> </filter-mapping> |
1. /WEB-INF/shiro.ini
2. 在 classpath 根目录下 shiro.ini 文件
下面是上述配置所做的事情:
l EnvironmentLoaderListener 初始化一个 Shiro WebEnvironment 实例(其中包含 Shiro 需要的一切操作,包括 SecurityManager ),使得它在 ServletContext 中能够被访问。如果你需要在任何时候获得 WebEnvironment 实例,你可以调用 WebUtils.getRequiredWebEnvironment ( ServletContext )。
l ShiroFilter 将使用此 WebEnvironment 对任何过滤的请求执行所有必要的安全操作。
l 最后,filter-mapping 的定义确保了所有的请求被 ShiroFilter 过滤,建议大多数 Web 应用程序使用以确保任何请求是安全的。
默认情况下,EnvironmentLoaderListener 将创建一个 IniWebEnvironment 实例,读取 Shiro 基于 INI 文件的配置。如果你愿意,你可以在 web.xml 中指定一个自定义的 ServletContext context-param :
<context-param> <param-name>shiroEnvironmentClass</param-name> <param-value>com.foo.bar.shiro.MyWebEnvironment</param-value> </context-param> |
1. /WEB-INF/shiro.ini
2. classpath:shiro.ini
它将使用最先发现的那个。
然而,如果你想把你的配置放在另一位置,你可以在web.xml 中用 contex-param 指定该位置。
<context-param> <param-name>shiroConfigLocations</param-name> <param-value>YOUR_RESOURCE_LOCATION_HERE</param-value> </context-param> |
但你也可以指定具体的文件系统,如classpath 或 URL 位置,通过使用 Shiro 支持的合适的资源前缀,例如:
l file://home/foobar/myapp/shiro.ini
l classpath:com/foo/bar/shiro.ini
l url:http://confighost.mycompany.com/myapp/shiro.ini
Shiro 1.1 and earlier
在Web 应用程序中使用 Shiro 1.1 或更早版本的最简单的方法是定义 IniShiroFilter 并指定一个 filter-mapping:
<filter> <filter-name>ShiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class> </filter> … <!-- Make sure any request you want accessible to Shiro is filtered. /* catches all --> <!-- requests. Usually this filter mapping is defined first (before all others) to --> <!-- ensure that Shiro works in subsequent filters in the filter chain: --> <filter-mapping> <filter-name>ShiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
<filter> <filter-name>ShiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class> <init-param> <param-name>configPath</param-name> <param-value>/WEB-INF/anotherFile.ini</param-value> <init-param> </filter> |
<filter> <filter-name>ShiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class> <init-param> <param-name>config</param-name> <param-value> # INI Config Here </param-value> </init-param> </filter> ... |
l 你可能编辑了许多安全配置,不希望为web.xml 添加版本控制。
l 你可能想从余下的web.xml 配置中分离安全配置。
l 你的安全配置可能变得很大,你想保持web.xml 的苗条并易于阅读。
l 你有个负责的编译系统,相同的shiro 配置可能需要在多个地方被引用。
Web INI配置
除了在配置章节描述的标准的[main] , [user] 和 [roles] 项外,你可以在 shiro.ini 文件中指定具有 web 特性的 [urls] 项:
[urls]项允许你做一些在我们已经见过的任何 Web 框架都不存在的东西:在你的应用程序中定义自适应过滤器链来匹配 URL 路径!
在urls 项的每一行格式如下:
URL_Ant_Path_Expression = Path_Specific_Filter_Chain
例如:
… [urls] /index.html = anon /user/create = anon /user/** = authc /admin/** = authc, roles[administrator] /rest/** = authc, rest /remoting/rpc/** = authc, perms["remot:invoke"] |
顺序的重要性! URL 路径表达式按事先定义好的顺序判断传入的请求,并遵循 FIRST MATCHWINS 这一原则。例如,让我们假设有如下链的定义: /account/** = ssl, authc /account/signup = anon 如果传入的请求旨在访问/account/signup/index.html (所有 'anon'ymous 用户都能访问),那么它将永不会被处理!原因是因为 /account/** 的模式第一个匹配了传入的请求,“短路”了其余的定义。 始终记住基于FIRST MATCH WINS 的原则定义你的过滤器链! |
filter1[optional_config1], filter2[optional_config2], ..., filterN[optional_configN]
l filterN 是一个定义在 [main] 项中的 filter bean 的名字。
l [optional_configN]是一个可选的括号内的对特定的路径,特定的过滤器有特定含义的字符串(每个过滤器,每个路径的具体配置!)。若果该过滤器对该 URL 路径并不需要特定的配置,你可以忽略括号,于是 filteNr[] 就变成了 filterN 。
因为过滤器标志符定义了链(又名列表),所以请记住 顺序问题 !请按顺序定义好你的逗号分隔的列表,这样请求就能够流通这个链。
在过滤器链中能够使用的过滤器“池”被定义在[main] 项。在 [main] 项中指派给它们的名字就是在过滤器链定义中使用的名字。例如:
[main]
…
myFilter = com.company.web.some.FilterImplementation
myFilter.property1 = value1
…
[urls]
…
/some/path/** = myFilter
相关文章推荐
- Spring+struts联网正常,断网启动报错:java.net.UnknownHostException: struts.apache.org
- apache mod_proxy 扩展模块安装
- Apache POI使用详解(excel为主)
- 使用 Apache Phoenix and HBase 结合 saiku 做大数据查询分析
- RESTEasy通过ApacheAPI或JavaAPI进行TEXT、XML、JSON数据交换
- ClassNotFoundException: org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver
- Caused by: java.lang.ClassNotFoundException: org.apache.neethi.Policy
- ClassNotFoundException: org.apache.ws.commons.schema.resolver.URIResolver
- Caused by: java.lang.ClassNotFoundException: org.apache.axiom.om.OMNode
- 解决:org.apache.axis2.AxisFault: Transport out has not been set
- Caused by: java.lang.ClassNotFoundException: org.apache.ws.commons.schema.utils.
- 解决:java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException
- 解决:ClassNotFoundException: org.apache.oro.text.regex.MalformedPatternException
- Apache MINA/NIO的学习
- Apache 的知识点
- Apache日志分割
- Windows7上简单安装运行Apache Kafka教程
- Mac 下配置Apache Ant
- apache支持php测试
- Apache 多端口多站点配置方法