【问题标题】:How to prevent accessing a Servlet unauthenticated with Apache Shiro?如何防止访问未经 Apache Shiro 身份验证的 Servlet?
【发布时间】:2015-01-13 13:52:09
【问题描述】:

我正在使用 Apache Shiro 进行 Web 应用程序的管理员身份验证。所有的管理内容都放在 /admin 目录下,我有一个 AdminServlet 来处理对管理功能的请求。 Admin Servlet 的 URL 映射是 /Admin。如果用户想要访问 /admin 下的内容,Shiro 成功拦截请求并重定向到登录页面。但是,我在浏览器的 URL 栏中输入 /Admin,我基本上可以绕过 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 文件中作为经过身份验证的内容,但结果在提交凭据后我一直被重定向到登录页面。

提前谢谢你!

【问题讨论】:

    标签: java apache servlets shiro


    【解决方案1】:

    试试这个:

    1. 您的 Admin Servlet url-pattern 如下所示:
      <url-pattern>/admin/*</url-pattern>
    
    1. 将此添加到您的web.xml
      <listener>
         <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
      </listener>
    
    1. 将您的 filter-mapping 替换为:
      <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
    

    希望有帮助!

    【讨论】:

    • 如果有人尝试访问受限功能,通过重定向回登录来解决问题,但这也很有帮助!
    猜你喜欢
    • 2016-07-02
    • 2016-04-02
    • 1970-01-01
    • 2014-12-06
    • 2017-06-28
    • 2014-04-27
    • 2017-04-30
    • 1970-01-01
    • 2019-08-02
    相关资源
    最近更新 更多