我正在用@BalusC的文章一步一步地学习Shiro
,直到我把它变成基于形式的身份验证就像文章的第五部分所说的那样,没有问题。
我完全按照文章所说的做了,但是shiro并没有将我重定向到登录页面,相反,每当我运行我的web应用程序时,它总是显示index.xhtml
。
这是我的代码,我不知道我错过了什么。
web . xml :
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<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>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
</web-app>
shiro.ini :
[main]
authc.loginUrl = /login.xhtml
[users]
admin = password
[urls]
/login.xhtml = authc
/app/** = authc
它应该把我重定向到login.xhtml
,不是吗?
什么好主意吗?
如果在浏览器中使用的index.xhtml的确切url是/index.xhtml或/faces/index.xhtml(而不是/app/index.xhtml/),那么它根本不安全,您需要添加额外的行。另外,login.xhtml不应该是安全的:
[urls]
/login.xhtml = anon
/index.xhtml = authc
/app/** = authc
另外,如果你在浏览器中输入的url是/,它是不安全的。
Shiro查看浏览器来自的url,它对jsf一无所知。
所以如果你的目标是保护一切,配置应该是:
[urls]
/login.xhtml = anon
/** = authc
注意顺序很重要,第一次命中是它将做出反应的地方。所以登录应该是第一位的,然后才是其他的,否则你的登录页面也将是安全的。