2017-02-14 22 views
0

Im currenlty работает над веб-приложением Java EE с Spring MVC. Я хочу защитить его с помощью Apache Shiro и проверки подлинности на основе формы с помощью FormAuthenticationFilter уже работает. Теперь я хочу настроить логин и написать свой собственный логин-контроллер.Apache Shiro: не удалось получить доступ к защищенному URL, хотя успешно прошел регистрацию

Вот моя проблема: проверка подлинности работает, я не получаю никаких исключений, но я все еще не могу получить защищенный 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; 
} 

Я был бы очень рад, если кто-то может сказать мне, что я «Я делаю неправильно, я застрял в этом несколько дней и не нашел ничего в Интернете.

С уважением, M.B.

P.S. Я не размещал свой web.xml и мой pom.xml, потому что сиро уже работает с FormAuthenticationFilter. Но если кому-то все еще нужны эти файлы, чтобы дать мне ответ, это не проблема, чтобы опубликовать их тоже.

ОБНОВЛЕНИЕ 1: Это должно быть проблема с самим Сиро. Если я убегаю только последнюю строку в файле shiro.ini,

#/welcome.jsp = authc 

переназначение работает правильно и имя пользователя: «админы» отображается только на приветствиях-странице, если ввести имя пользователя и пароль правильно.

По какой-то причине сиро не принимает аутентифицированного пользователя, но я совершенно не знаю, почему.

ответ

1

Наконец-то я нашел решение, я надеюсь, это поможет кому-то еще.

Проблема была в том, что я создал поле для currentUser (как вы можете видеть в моем методе), и я инициализировал его в конструкторе контроллера. В то время никакой диспетчер безопасности не был найден, поэтому я также создал экземпляр SecurityManager, но теперь это было другое, чем apache siro, используемое для перенаправления меня.

Чтобы решить эту проблему, я просто должен был создать экземпляр

this.currentUser = SecurityUtils.getSubject(); 

в соответствующем методе и не в конструкторе.