2016-11-24 9 views
1

私はWebプロジェクトで2つの要素の認証を実装しています。私たちは認証と認可のためにSHIROを使用しています。 ユーザーがログインすると(SecurityUtils.getSubject()。login(subjectToken);) ユーザーは任意のページを開くことができます。 認証を完了するために、携帯電話で送信されたPINをユーザーに尋ねます。ログイン後の次のページで、ユーザーがPINを入力せず、URLを書き込んでホームページを直接開くと、PIN検証をバイパスできます。 roleRedirectとauthenticationRedirectを確認しましたが、リクエストはこれらのフィルタには含まれていません。 誰でもSHIROを使用して2つの要素を実装する正しい方法は何か教えてください。SHIROを使用した二要素認証

答えて

0

Shiroはまだ2つの要素の認証をサポートしていません。したがって、最初のパスワードログインと第2の要因の間の状態の追跡を処理する必要があります。あるいは、認可を使用してこれを管理できます。ユーザーが一度ログインすると、有効なパスワードを入力しますが、指定された権限 '2factor'がありません。この権限がない場合は、2番目の要素ページにリダイレクトできます。一度入力すると、ユーザーに「2facter」権限を与えることができます。

0

フィルタを作成して、セッションがotpverified変数を持っているかどうかを確認するか、私たちが一般的に行うようにします。

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); 
    } 
関連する問題