我正在使用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文件中作为经过身份验证的内容,但结果是我在提交凭据后不断重定向到登录页面。
提前谢谢!
答案 0 :(得分:0)
试试这个:
url-pattern
是这样的: <url-pattern>/admin/*</url-pattern>
web.xml
: <listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
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
希望有所帮助!