2016-11-24 4 views
1

Я реализую двухфакторную аутентификацию в своем веб-проекте. мы используем SHIRO для аутентификации и авторизации. Как только пользователь вошел в систему (SecurityUtils.getSubject(). Login (subjectToken);) пользователь может открыть любую страницу. Я хочу спросить у пользователя PIN-код, отправленный на его мобильный телефон, для завершения проверки подлинности. На следующей странице после входа в систему, если пользователь не вводит ПИН-код и напрямую не открывает домашнюю страницу путем написания URL-адреса, он может обойти проверку PIN-кода. Я проверил roleRedirect и authenticationRedirect, но запрос не поступает в эти фильтры. Может ли кто-нибудь сказать мне, что является правильным способом реализовать два фактора с помощью SHIRO.Двухфакторная аутентификация с использованием SHIRO

ответ

0

У Shiro еще нет поддержки для двух факторов. Таким образом, вам нужно будет обрабатывать отслеживание состояния между начальным паролем и вторым фактором. Или вы можете управлять этим с помощью авторизации. Когда пользователь регистрируется, как только они вводят действительный пароль, но у них нет заданного разрешения «2factor». Если этого разрешения нет, вы можете перенаправить на свою вторую страницу факторов, после ввода вы можете предоставить пользователю разрешение «2facter».

0

Просто создайте фильтр и проверьте, что сессия имеет отпущенную переменную true или нет, как обычно.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     // TODO Auto-generated method stub 
     // place your code here 

     // pass the request along the filter chain 
     //System.out.println(enabled); 
      if(enabled){ 
      if(SecurityUtils.getSubject().getPrincipal()!=null){ 
       if(request instanceof HttpServletRequest){ 
        HttpSession session = ((HttpServletRequest) request).getSession(); 
        LoggedInUser user = (LoggedInUser) session.getAttribute("userinfo"); 
        String url = ((HttpServletRequest) request).getRequestURL().toString(); 
        //System.out.println("url is "+ url +" subject is: "+ SecurityUtils.getSubject().isAuthenticated()); 

        if(SecurityUtils.getSubject().isAuthenticated() && !url.contains("public") && !user.isOTPverified()){ 



         if(user.getOTP() == null) 
          { 

           if(user.getTOTPSecret()!=null && user.getTOTPSecret().length()>0) 
           { 
            user.setOTP("TOTP"); 
           }else 
           { 
            user.setOTP(OTPUtils.generateOTP()); 
            new SendMail().send("[email protected]", "OTP for accessing ","OTP is "+ user.getOTP(), 1, new String[] {}); 
           } 

          } 
         //user.setOTPverified(true);       
         ((HttpServletRequest) request).getRequestDispatcher("OTPVerify.jsp").forward(request, response); 

         return; 
        } 
       } 
      } 


      } 

     chain.doFilter(request, response); 
    } 
Смежные вопросы