无法在 Apache Shiro 中设置成功 URL

Posted

技术标签:

【中文标题】无法在 Apache Shiro 中设置成功 URL【英文标题】:Not able to set success URL in Apache Shiro 【发布时间】:2016-03-28 09:30:53 【问题描述】:

我试图使用 Apache Shiro 作为安全框架来保护我的 Web 应用程序。这样做时,我想设置成功登录后用户被重定向到的成功 URL。默认情况下,客户端在成功登录后会被重定向到最初请求的页面(在 API 中提到)。

https://shiro.apache.org/static/1.2.1/apidocs/src-html/org/apache/shiro/web/filter/authc/AuthenticationFilter.html

我的问题是,我们能否更改此默认行为并在登录时将用户重定向到特定的成功页面?

据我所知,我们可以在 shiro.ini 文件中提及这一点

authc.successUrl  = /personalaccountpage.html

其中 authc 是启用 shiro 的应用程序中提供的隐式对象。但这似乎并没有被应用程序选中。用户总是被重定向到请求的 URL。

我知道这是不合逻辑的说法,即使用户请求了特定页面,我也想将用户重定向到其他页面,但是我想了解下面提供给我们的配置的目的:

authc.successUrl

我使用 Apache Shiro 1.2.4 和 Tomcat 7 作为我的 Web 应用程序的容器。

以下是这里涉及的主要文件:

shiro.ini 文件

# =============================================================================
# Tutorial INI configuration
#
# Usernames/passwords are based on the classic Mel ***s' film "Spaceballs" :)
# =============================================================================


[main]

# specify login page
authc.loginUrl = /login.jsp

# redirect after successful login
authc.successUrl  = /personalaccountpage.html

# name of request parameter with username; if not present filter assumes 'username'
authc.usernameParam = user
# name of request parameter with password; if not present filter assumes 'password'
authc.passwordParam = pass
# does the user wish to be remembered?; if not present filter assumes 'rememberMe'
authc.rememberMeParam = remember

# -----------------------------------------------------------------------------
# Users and their (optional) assigned roles
# username = password, role1, role2, ..., roleN
# -----------------------------------------------------------------------------
[users]
root = secret, admin
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr = vespa, goodguy, schwartz

# -----------------------------------------------------------------------------
# Roles with assigned permissions
# roleName = perm1, perm2, ..., permN
# -----------------------------------------------------------------------------
[roles]
admin = *
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5

[urls]
/**=authc

我的 web 应用的 web.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">

    <display-name>Archetype Created Web Application</display-name>

    <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>
</web-app>

我的 web 应用程序的 login.jsp 页面。用户在请求任何 URL 时重定向到此处以进行登录

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Please Log In</title>
    </head>
    <body>
<form name="loginform" action="" method="post">
        <table align="left" border="0" cellspacing="0" cellpadding="3">
            <tr>
                <td>Username:</td>
                <td><input type="text" name="user" maxlength="30"></td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type="password" name="pass" maxlength="30"></td>
            </tr>
            <tr>
                <td colspan="2" align="left"><input type="checkbox" name="remember"><font size="2">Remember Me</font></td>
            </tr>
            <tr>
                <td colspan="2" align="right"><input type="submit" name="submit" value="Login"></td>
            </tr>
        </table>
    </form>
    </body>
    </html>

如果我遗漏了任何细节,请告诉我。

【问题讨论】:

你把 shiro.ini 文件放在哪里了? 嗨 @Wouter 我的 shiro.ini 文件在 WEB-INF 中 【参考方案1】:

你必须添加

/login.jsp = authc

在 shiro.ini 的 url 部分。

/login.jsp 不限于经过身份验证的用户(否则没有人可以登录!),但仍必须为其指定“authc”过滤器,以便它可以处理该 url 的登录提交。按照上面的 shiro.loginUrl 的规定,允许这些请求通过是足够“智能”的。

【讨论】:

【参考方案2】:

我想了解配置的目的 在下面提供给我们

authc.successUrl 是用户从登录页面(应该是 login.jsp 并且通常也应该是应用程序的欢迎页面)到达的用户,没有他想访问的 URL。如果你想重定向到静态页面,你可以扩展原始类并做任何你喜欢的事情。

【讨论】:

以上是关于无法在 Apache Shiro 中设置成功 URL的主要内容,如果未能解决你的问题,请参考以下文章

Apache shiro 属性“sessionManager.globalSessionTimeout”不存在

shiro的session失效后重新登录,怎么回到首页

无法在 apache2 [Debian 7.1] 中设置默认索引页

Shiro的FormAuthenticationFilter登陆成功不跳转

Shiro ini配置

如何在HTTP标头中设置REMOTE_USER?