Java Apache Shiro:虽然已成功登录,但无法访问安全URL

Java Apache Shiro:虽然已成功登录,但无法访问安全URL,java,apache,spring-mvc,shiro,Java,Apache,Spring Mvc,Shiro,我目前正在使用SpringMVC开发JavaEEWeb应用程序。 我想用ApacheShiro和基于表单的身份验证来保护它 FormAuthenticationFilter已在运行。 现在我想自定义登录并编写自己的登录控制器 这是我的问题:身份验证有效,我没有得到任何异常,但我仍然无法访问安全URL(/welcome.jsp),即使我尝试直接访问它,尽管我已正确登录(Subject.isAuthenticated返回true) 这是我的shiro.ini: # =================

我目前正在使用SpringMVC开发JavaEEWeb应用程序。 我想用ApacheShiro和基于表单的身份验证来保护它 FormAuthenticationFilter已在运行。 现在我想自定义登录并编写自己的登录控制器

这是我的问题:身份验证有效,我没有得到任何异常,但我仍然无法访问安全URL(/welcome.jsp),即使我尝试直接访问它,尽管我已正确登录(Subject.isAuthenticated返回true)

这是我的shiro.ini:

# =======================
# Shiro INI configuration
# =======================

[main]
authc = org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter
#authc = org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authc.loginUrl = /login.jsp
authc.successUrl = /welcome.jsp

sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
securityManager.sessionManager = $sessionManager

[users]
admin=admin, ROLE_ADMIN

[roles]
ROLE_ADMIN = *

[urls]
/login.jsp = authc
/welcome.jsp = authc
下面是各个控制器类中的方法:

@RequestMapping(value="/login", params ={"username","password"})
public ModelAndView login(HttpServletRequest request, HttpServletResponse response,
     @RequestParam("username") String username, @RequestParam("password") String password) {

     if (!this.currentUser.isAuthenticated()) {
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            try {
                this.currentUser.login(token);
            } catch (UnknownAccountException uae) {
                logger.info("There is no user with username of " + token.getPrincipal());
            } catch (IncorrectCredentialsException ice) {
                logger.info("Password for account " + token.getPrincipal() + " was incorrect!");
            } catch (LockedAccountException lae) {
                logger.info("The account for username " + token.getPrincipal() + " is locked.  " +
                        "Please contact your administrator to unlock it.");
            }

            catch (AuthenticationException ae) {
                //TODO
            }


            logger.info("User [" + currentUser.getPrincipal() + "] logged in successfully.");

        }

    String message = "";
    ModelAndView modelAndView = new ModelAndView("login", "message", message);
    String fallbackUrl = "/welcome.jsp";
    try
    {
        WebUtils.redirectToSavedRequest(request, response, fallbackUrl);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

    return modelAndView;
}
如果有人能告诉我,我做错了什么,我会非常高兴。我已经在这上面呆了几天了,在网上什么也没找到

致以最良好的祝愿, 文学硕士

另外,我还没有发布我的web.xml和pom.xml,因为shiro已经在使用FormAuthenticationFilter了。但是,如果有人仍然需要这些文件来给我一个答案,那么把它们也贴出来也没问题

更新1:这一定是Shiro本身的问题。如果我只转义shiro.ini文件中的最后一行

 #/welcome.jsp = authc
重定向工作正常,只有在正确输入用户名和密码的情况下,用户名:“admin”才会显示在欢迎页面上


出于某种原因,shiro不接受经过身份验证的用户,但我完全不知道为什么。

我终于找到了一个解决方案,我希望,这将帮助其他人

问题是我为currentUser创建了一个字段(正如您在我的方法中看到的),并在控制器的构造函数中初始化了它。当时,没有找到安全管理器,所以我也创建了一个SecurityManager实例,但现在这是一个不同的实例,不同于ApacheShiro用于重定向我的实例

要解决这个问题,我只需举例说明

this.currentUser = SecurityUtils.getSubject();

在各自的方法中,而不是在构造函数中。

我终于找到了一个解决方案,我希望,这将帮助其他人

问题是我为currentUser创建了一个字段(正如您在我的方法中看到的),并在控制器的构造函数中初始化了它。当时,没有找到安全管理器,所以我也创建了一个SecurityManager实例,但现在这是一个不同的实例,不同于ApacheShiro用于重定向我的实例

要解决这个问题,我只需举例说明

this.currentUser = SecurityUtils.getSubject();
在各自的方法中,而不是在构造函数中