2

我正在我的 Web 应用程序中用 Apache Shiro 替换 Siteminder。我注意到 shiro 成功登录并带我进入主页。当我单击主页上的任何其他链接时,我将返回登录页面。我再次登录,我被转发到我想要转到的页面。我怎样才能解决这个问题?

这是我的 shiro.ini

[main]
authc.loginUrl = /login.jsp
ssl.enabled=false

[users]
user=admin

[urls]
/css/** = anon
/images/** = anon
/js/** = anon
/login.jsp = authc
/logout = logout
/** = authc

我的 web.xml 中的一个部分

<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>

在我的用户类中打印出 currentUser.isAuthenticated() 显示“真”。

我可以提供任何其他信息吗?

4

4 回答 4

2

我认为问题与在 shiro.ini 文件中您没有强制执行 SSL 的事实有关:

ssl.enabled=false

但是,在 weblogic.xml 文件中,您正在为 cookie 实施 SSL:

<session-param>     
<param-name>CookieSecure</param-name>
<param-value>true</param-value>
</session-param>

因此,我的建议是将 shiro.ini 更改为:

ssl.enabled=true

并保留原始 weblogic.xml 文件。

这样,您将只接受通过 SSL 进行身份验证的用户(这是一个很好的做法)。

请让我知道结果。

谢谢法比奥@fcerullo

于 2013-03-30T14:21:52.380 回答
1

您的配置看起来几乎与Shiro 示例 Web 应用程序完全相同(实际上,使用 authc.loginUrl 而不是示例应用程序使用的已弃用的全局“shiro.loginUrl”,您的配置会更好)。示例应用程序没有表现出您所看到的行为。

这让我相信其他东西(另一个过滤器?)给你带来了问题。您是否有一个可以展示问题的小示例应用程序(可能在 Github 上)?如果可以重新创建,我很乐意看看。

于 2013-03-15T17:01:35.347 回答
0

我弄清楚发生了什么事。我的应用程序部署在 Weblogic 上,并且我在 weblogic.xml 中有以下部分,这导致了问题。删除它,修复它。知道为什么会这样吗?

<session-param>     
<param-name>CookieSecure</param-name>
<param-value>true</param-value>
</session-param>
于 2013-03-19T18:20:12.417 回答
0

我经历过同样的行为,但我使用的是 Wildfly 10.0.0 和 apache shiro v 1.3.2。

我在这篇 Jboss 论坛文章中找到了解决方案。

将 cookie 名称设置为JSESSIONID其他名称可以解决此问题。

此处提供的解决方案是在 shiro.ini 中添加以下内容

sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
cookie = org.apache.shiro.web.servlet.SimpleCookie
cookie.name = shiro.session.id
sessionManager.sessionIdCookie = $cookie

这对我有用。

于 2016-11-12T22:17:04.780 回答