zoukankan      html  css  js  c++  java
  • Apache Shiro Web应用整合-配置

     

    博客分类:

    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>

    这是假设Shiro INI  配置文件在以下两个位置任意一个,并使用最先发现的那个:

    1. /WEB-INF/shiro.ini

    2. 在 classpath  根目录下 shiro.ini  文件

    下面是上述配置所做的事情:

    EnvironmentLoaderListener 初始化一个 Shiro WebEnvironment  实例(其中包含 Shiro  需要的一切操作,包括 SecurityManager ),使得它在 ServletContext  中能够被访问。如果你需要在任何时候获得 WebEnvironment  实例,你可以调用 WebUtils.getRequiredWebEnvironment ( ServletContext )。

    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

  • 相关阅读:
    pyc文件是什么【转载】
    Linux下的python等操作【转载】
    P1012 拼数 字符串
    P1309 瑞士轮 排序选择 时间限制 归并排序
    商业竞争 三分+背包
    老虎ji 剪枝模拟
    交通灯 并查集
    三色抽卡游戏 博弈论nim
    质数串 乱搞
    自动驾驶系统 bfs
  • 原文地址:https://www.cnblogs.com/li1111xin/p/5163694.html
Copyright © 2011-2022 走看看