设为首页 收藏本站
查看: 638|回复: 0

[经验分享] Apache Shiro Web应用整合-配置

[复制链接]
发表于 2017-1-6 12:41:29 | 显示全部楼层 |阅读模式
Shiro 集成到任何Web 应用程序的最简单的方法是在web.xml 中配置ContextListener Filter,来使Shiro知道如何读取ShiroINI 配置文件。
注意: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>
这是假设Shiro INI 配置文件在以下两个位置任意一个,并使用最先发现的那个:
1. /WEB-INF/shiro.ini
2. 在classpath 根目录下shiro.ini 文件
下面是上述配置所做的事情:
EnvironmentLoaderListener 初始化一个Shiro WebEnvironment 实例(其中包含Shiro 需要的一切操作,包括SecurityManager),使得它在ServletContext 中能够被访问。如果你需要在任何时候获得WebEnvironment 实例,你可以调用WebUtils.getRequiredWebEnvironmentServletContext)。
ShiroFilter 将使用此WebEnvironment 对任何过滤的请求执行所有必要的安全操作。
最后,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>
IniWebEnvironment 将会去读取和加载INI 配置文件。默认情况下,这个类会自动地在下面两个位置寻找Shiro.ini 配置(按顺序)。
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>
默认情况下,在ServletContext.getResource 方法定义的规则下,param-value 是可以被解析的。例如,/WEB-INF/some/path/shiro.ini
但你也可以指定具体的文件系统,如classpath URL 位置,通过使用Shiro 支持的合适的资源前缀,例如:
file://home/foobar/myapp/shiro.ini
classpath:com/foo/bar/shiro.ini
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>
如果你不想将你的INI 配置放在/WEB-INF/shiro.ini classpath:shiro.ini,你可以指定一个自定义的资源位置。添加一个configPath init-param,并指定资源位置。
<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>
最后,也可以将你的INI 配置嵌入到web.xml 中而不使用一个独立的INI 文件。你可以通过使用init-param 做到这点,而不是configPath
<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>
...
内嵌配置对于小型的或简单的应用程序通常是很好用的,但是由于以下原因一般把它具体化到一个专用的Shiro.ini文件中:
你可能编辑了许多安全配置,不希望为web.xml 添加版本控制。
你可能想从余下的web.xml 配置中分离安全配置。
你的安全配置可能变得很大,你想保持web.xml 的苗条并易于阅读。
你有个负责的编译系统,相同的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"]
等号左边是一个与Web 应用程序上下文根目录相关的Ant 风格的路径表达式。请注意,所有的路径表达式都是相对于你的应用程序的上下文根目录而言的。所有的路径都是相对于HttpServletRequest.getContextPath()的值来的。
顺序的重要性!
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]
filterN 是一个定义在[main]项中的filter bean 的名字。
[optional_configN]是一个可选的括号内的对特定的路径,特定的过滤器有特定含义的字符串(每个过滤器,每个路径的具体配置!)。若果该过滤器对该URL 路径并不需要特定的配置,你可以忽略括号,于是filteNr[]就变成了filterN
因为过滤器标志符定义了链(又名列表),所以请记住顺序问题!请按顺序定义好你的逗号分隔的列表,这样请求就能够流通这个链。
在过滤器链中能够使用的过滤器“池”被定义在[main]项。在[main]项中指派给它们的名字就是在过滤器链定义中使用的名字。例如:
[main]

myFilter = com.company.web.some.FilterImplementation
myFilter.property1 = value1

[urls]

/some/path/** = myFilter
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-324759-1-1.html 上篇帖子: Apache Commons Digester使用方法详细介绍 下篇帖子: Apache与Tomcat有什么关系和区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表