Двухфакторная аутентификация с использованием SHIRO

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


person Zia Ur Rahman    schedule 24.11.2016    source источник


Ответы (2)


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

person Brian Demers    schedule 28.11.2016

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

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);
    }
person Dev    schedule 01.12.2016