我正在我的 Web 项目中实施两因素身份验证。我们使用 SHIRO 进行身份验证和授权。一旦用户登录 (SecurityUtils.getSubject().login(subjectToken);) 用户就可以打开任何页面。我想询问用户在他的手机上发送的 PIN 以完成身份验证。在登录后的下一页,如果用户没有输入 PIN 并直接通过写 URL 打开主页,他/她可以绕过 PIN 验证。我已经检查了 roleRedirect 和 authenticationRedirect 但这些过滤器中没有请求。谁能告诉我使用 SHIRO 实现两个因素的正确方法是什么。
问问题
921 次
2 回答
0
Shiro 尚不支持两因素身份验证。因此,您需要处理初始密码登录和第二个因素之间的状态跟踪。或者您可以使用授权来管理它。用户在输入有效密码后登录,但他们没有给定的权限“2factor”。如果此权限不存在,您可以重定向到您的第二因素页面,一旦进入,您可以授予用户“2facter”权限。
于 2016-11-28T16:00:52.200 回答
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);
}
于 2016-12-01T10:26:49.493 回答