Apache Shiro和多重身份验证

时间:2014-07-10 03:05:01

标签: apache security authentication shiro

我正在开发一个应用程序,我已经实现了基于Apache Shiro的身份验证。我现在可以让用户成功登录我的数据库。我知道要改进这一点并允许第二步。

所以场景将是:

用户1未启用多重身份验证。他成功登录凭证。

用户2确实启用了多重身份验证。他像往常一样登录,Apache Shiro验证用户名/密码。完成此操作后,我希望Apache Shiro显示另一个用户2可以输入一次性密码的屏幕。只有在这是正确的时候才能完全登录。

在Apache Shiro中,我可以注入我的更改吗? 我找不到很多关于它的文档。

1 个答案:

答案 0 :(得分:0)

我在验证后对OTP有类似的要求,我使用普通过滤器来过滤掉所有请求。像使用isOTPEnabled一样在use bean中创建一个属性,并在过滤器中对它进行比较。

我的简单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");
    }

}