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