【问题标题】: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");
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 2017-06-28
      • 2017-04-08
      • 2014-12-20
      • 2016-04-02
      • 2012-11-03
      • 2016-10-29
      • 2014-12-06
      • 2013-01-30
      相关资源
      最近更新 更多