我正在用 J2E 开发一个带有 struts 2 和 tomcat v6 的应用程序。
我的应用程序中有一个登录页面,用户必须通过单击虚拟键盘(我自己制作)来输入密码。
在键盘出现之前,我有一个操作来随机化字符的.出于安全原因,此操作还会对所有字符进行编码,并在会话中设置字符和代码的映射。
身份验证是通过 tomcat 中的 JDBC 领域完成的。
我正在尝试做的是解码用户的密码。我尝试了带有 url 模式"j_security_check"的过滤器,但我发现无法在过滤器中捕获此事件。
所以我正在尝试在 JDBC 领域解码密码,但它不起作用。我尝试在领域中使用 ServletActionContext.getRequest(),但我面临空指针异常。
是否可以将地图存储在域中的会话中?如果不是,欢迎提供有关如何执行此操作的任何线索,因为我还没有找到任何解决方案。
一个可能的解决方案是编写自定义身份验证器,扩展 FormAuthenticator
例如。
//Will expand the basic FORM authentication to include auth based on request headers
public class CustomAuthenticator extends FormAuthenticator{
public boolean authenticate(Request request, Response response, LoginConfig config) throws IOException{
if(request.getUserPrincipal() == null){
Realm realm = context.getRealm();
//Pick the user name and password from the request headers
//you can decode the password here
if(username == null || pass ==null) return super.authenticate(....);
boolean authenticated = realm.authenticate(username, pass);
if(authenticated == false) return false;
//Set the username/password on the session and set the principal in request
session.setNote(Constants.SESS_USERNAME_NOTE, username);
session.setNote(Constants.SESS_PASSWORD_NOTE, password);
request.setUserPrincipal(principal);
register(request, response, principal, Constants.FORM_METHOD, username, pass);
}
return true;
}
}
另请参阅:http://apachecon.com/eu2007/materials/UnderstandingTomcatSecurity.pdf 和 http://javaevangelist.blogspot.com/2012/12/tomcat-7-custom-valve.html