【问题标题】:Apache Shiro and Multi-factor AuthenticationApache Shiro 和多因素身份验证
【发布时间】:2014-08-31 06:08:17
【问题描述】:
我正在开发一个应用程序,在该应用程序中实现了基于 Apache Shiro 的身份验证。我现在可以让用户在我的数据库的支持下成功登录。我知道想要改进这一点并允许第二个漫长的步骤。
所以场景是:
用户 1 未启用多重身份验证。他使用凭据成功登录。
用户 2 确实启用了多因素身份验证。他照常登录,Apache Shiro 验证用户名/密码。完成后,我希望 Apache Shiro 显示另一个屏幕,用户 2 可以在其中输入一次性密码。并且只有在正确的情况下才能完全登录。
我可以在 Apache Shiro 中注入我的更改吗?
我找不到太多关于它的文档。
【问题讨论】:
标签:
apache
security
authentication
shiro
【解决方案1】:
我有一个类似的要求,即身份验证后的 OTP,我使用普通过滤器过滤掉所有请求。在使用 bean 中创建一个属性,如 isOTPEnabled 并在过滤器中进行比较。
我的简单 otpFliter 代码如下,但您可以根据需要制作自己的代码,如 jsf 等。您必须添加一个登录,如果用户 bean 的 OTPenabled 设置为 true,则它才会过滤:
/**
* Servlet Filter implementation class OTPFilter
*/
@WebFilter(urlPatterns = {"/*"},initParams={@WebInitParam(name="enabled",value="0")})
public class OTPFilter implements Filter {
/**
* Default constructor.
*/
boolean enabled=true;
public OTPFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
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);
if( !url.contains("public") && !user.isOTPverified() && user.isOTPEnabled()){
if(user.getOTP() == null)
{
user.setOTP(OTPUtils.generateOTP());
}
//user.setOTPverified(true);
((HttpServletRequest) request).getRequestDispatcher("OTP.jsp").forward(request, response);
return;
}
}
}
}
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
//System.out.println("fConfig.getInitParameter :" + fConfig.getInitParameter("enabled"));
enabled = fConfig.getInitParameter("enabled").equals("1");
}
}