使用SHIRO进行双因素身份验证

时间:2016-11-24 10:00:02

标签: authentication shiro multi-factor

我正在我的网络项目中实施双因素身份验证。我们正在使用SHIRO进行身份验证和授权。 用户登录后(SecurityUtils.getSubject()。login(subjectToken);) 用户可以打开任何页面。 我想问用户在他的手机上发送的PIN码以完成身份验证。在登录后的下一页,如果用户没有输入PIN并通过写入URL直接打开主页,他/她可以绕过PIN验证。 我检查了roleRedirect和authenticationRedirect,但请求不在这些过滤器中。 任何人都可以告诉我使用SHIRO实现两个因素的正确方法。

2 个答案:

答案 0 :(得分:0)

Shiro尚未支持双因素身份验证。因此,您需要处理初始密码登录和第二个因素之间的状态跟踪。或者你可以使用授权来管理它。用户在输入有效密码后登录,但他们没有给定的权限' 2因素。如果此权限不存在,您可以重定向到第二个因素页面,一旦输入,您就可以向用户授予' 2facter'权限。

答案 1 :(得分:0)

只需创建一个过滤器,并检查会话有哪些otpverified变量为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("abc@c.com", "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);
    }