无法在Apache Shiro中设置成功URL

时间:2015-12-22 07:18:23

标签: java tomcat java-ee tomcat7 shiro

我试图使用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 Brooks' 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

我的webapp的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>

我的webapp的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>

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

2 个答案:

答案 0 :(得分:1)

你必须添加

/login.jsp = authc

在shiro.ini的网址部分。

/login.jsp不限于经过身份验证的用户(否则无法登录!),但是&#39; authc&#39;必须仍然为它指定过滤器,以便它可以处理该URL的登录提交。它是聪明的&#39;足以允许通过上面的shiro.loginUrl指定的那些请求。

答案 1 :(得分:0)

  

我想了解配置的目的   提供给我们的是

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