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