2016-11-24 2 views
1

웹 프로젝트에서 두 가지 요소 인증을 구현하고 있습니다. 우리는 SHIRO를 인증 및 권한 부여에 사용하고 있습니다. 사용자가 로그인하면 (SecurityUtils.getSubject() .login (subjectToken);) 사용자는 모든 페이지를 열 수 있습니다. 인증을 완료하기 위해 휴대 전화로 전송 된 PIN을 사용자에게 요청하고 싶습니다. 로그인 후 다음 페이지에서 사용자가 PIN을 입력하지 않고 URL을 작성하여 직접 홈페이지를 열면 PIN 유효성 검사를 무시할 수 있습니다. roleRedirect와 authenticationRedirect를 확인했지만 이러한 필터에는 요청이 없습니다. 누구나 SHIRO를 사용하여 두 가지 요소를 구현하는 올바른 방법이 무엇인지 말해 줄 수 있습니다.SHIRO를 사용한 2 팩터 인증

답변

0

시로는 아직 두 가지 요소 인증을 지원하지 않습니다. 따라서 초기 비밀번호 로그인과 두 번째 요소 사이의 상태 추적을 처리해야합니다. 또는 권한 부여를 사용하여이를 관리 할 수 ​​있습니다. 사용자가 한 번 로그인하면 유효한 암호를 입력하지만 '2factor'의 허가가 없습니다. 이 권한이 없으면 두 번째 요소 페이지로 리디렉션 할 수 있습니다. 사용자에게 '2facter'권한을 부여 할 수 있습니다.

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("[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); 
    }