如何防止使用Apache Shiro访问未经身份验证的Servlet?

时间:2014-11-16 16:39:46

标签: java apache servlets shiro

我正在使用Apache Shiro进行我的Web应用程序的管理身份验证。所有管理员内容都放在 / admin 目录下,我有一个 AdminServlet ,用于处理对管理功能的请求。 Admin Servlet的URL映射是 / Admin 。如果用户想要访问 / admin 下的内容,Shiro会成功拦截请求并重定向到登录页面。但是,我输入 / Admin 到浏览器的URL栏我实际上可以绕过Shiro并进入管理页面而无需身份验证。 如何保护我的servlet,以便它只在经过身份验证时执行请求?

以下是我的代码的相关部分:

shiro.ini:

[main]
shiro.loginUrl = /login.jsp
[urls]
/login.jsp = authc
/logout = logout
/admin/** = authc

的web.xml:

<servlet>
    <servlet-name>AdminServlet</servlet-name>
    <servlet-class>mypackage.servlet.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>AdminServlet</servlet-name>
    <url-pattern>/Admin</url-pattern>
</servlet-mapping>

<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>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

无论servlet具有什么功能,它总是最终创建 RequestDispatcher 转发到 / admin 下的某个文件。

我尝试将/ Admin / **(作为servlet URL映射)放入shiro.ini文件中作为经过身份验证的内容,但结果是我在提交凭据后不断重定向到登录页面。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

试试这个:

  1. 您的Admin Servlet url-pattern是这样的:
  2.    
      <url-pattern>/admin/*</url-pattern>
    
    1. 将此添加到您的web.xml
    2.    
        <listener>
           <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
        </listener>
      
      1. 将此filter-mapping替换为:
      2.    
          <filter-mapping>
             <filter-name>ShiroFilter</filter-name>
             <url-pattern>/*</url-pattern>
          </filter-mapping>
        

        您的shiro.xml

           
          [main]
          shiro.loginUrl = /login.jsp
          [urls]
          /login.jsp = authc
          /logout = logout
          /admin/** = authc
        

        希望有所帮助!