我正在使用struts 2和tomcat v6在J2E中开发一个应用程序。
我的应用程序中有一个登录页面,用户必须通过单击虚拟键盘(我自己制作)来输入密码。
在键盘出现之前,我有一个动作来随机化字符' 。出于安全原因,此操作还会对所有字符进行编码,并在会话中设置字符和代码的映射。
使用tomcat中的JDBC域进行身份验证。
我要做的是解码用户的密码。我尝试过使用url-pattern" j_security_check"但我发现无法在过滤器中捕获此事件。
所以我试图在JDBC领域解码密码,但它无法正常工作。我试图在领域中使用ServletActionContext.getRequest(),但我面临一个空指针异常。
是否可以将地图存储在领域中的会话中? 如果不是,那么任何有关如何做到这一点的线索都是受欢迎的,因为我还没有找到任何解决方案。
答案 0 :(得分:0)
一个可行的解决方案是编写Custom Authenticator,扩展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