我正在开发一个应用程序,我已经实现了基于Apache Shiro的身份验证。我现在可以让用户成功登录我的数据库。我知道要改进这一点并允许第二步。
所以场景将是:
用户1未启用多重身份验证。他成功登录凭证。
用户2确实启用了多重身份验证。他像往常一样登录,Apache Shiro验证用户名/密码。完成此操作后,我希望Apache Shiro显示另一个用户2可以输入一次性密码的屏幕。只有在这是正确的时候才能完全登录。
在Apache Shiro中,我可以注入我的更改吗? 我找不到很多关于它的文档。
答案 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");
}
}