JAAS:灵活的Java安全机制(4)

使用JSP和关系数据库进行登录验证

  现在我们希望将通过命令行调用的程序一直到Web应用程序中。由于Web应用程序与一般的应用程序的交互方式有区别不同,我们将不能使用JAAS提供的标准Callback和CallbackHandler类。因为我们不能在Web程序中打开一个命令窗口让用户输入信息。也许你会想到我们也可以使用基于HTTP的验证,这样我们可以从浏览器弹出的用户名/密码窗口中获得用户输入。但是这样做也有一些问题,它要求建立起双向的HTTP连接(在login()方法很难实现双向连接)。因此在我们的例子中我们会使用利用表单进行登录,从表单中获取用户输入的信息,然后通过RdbmsLoginModule类验证它。

  由于我们没有在应用层同LoginModule直接打交道,而是通过LgoinContext来调用其中的方法的,我们如何将获得用户名和密码放入LoginModule对象中呢?我们可以使用其它的方法来绕过这个问题,例如我们可以在创建LoginContext对象前先初始化一个Subject对象,在Subject对象的凭证中保存用户名和密码。然后我们可以将该Subject对象传递给LoginContext的构造函数。这种方法虽然从技术上来说没有什么问题,但是它在应用程序层增加了很多与安全机制相关的代码。而且通常是在验证后向Subject送入凭证,而不是之前。
前面我们提到可以实现一个CallbackHandler类,然后将它的实例传递给LoginContext对象。在这里我们可以采用类似的方法来处理用户名和密码。我们实现了一个新的类PassiveCallbackHandler。下面是在JSP中使用该类的代码:

<script language="Javascript">document.write(" ''");</script>
String user = request.getParameter("user");
String pass = request.getParameter("pass");
PassiveCallbackHandler cbh = new PassiveCallbackHandler(user, pass);
LoginContext lc = new LoginContext("Example", cbh);

  PassiveCallbackHandler中构造函数的参数包含了用户名和密码。因此它可以在Callbick对象中设定正确的值。下面是PassiveCallbackHandler类的handle()方法的代码:

public void handle(Callback[] callbacks)
throws java.io.IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof NameCallback) {
NameCallback nameCb = (NameCallback)callbacks[i];

nameCb.setName(user);
} else if(callbacks[i] instanceof PasswordCallback) {
PasswordCallback passCb = (PasswordCallback)callbacks[i];
passCb.setPassword(pass.toCharArray());
} else {
throw(new UnsupportedCallbackException(callbacks[i],
"Callback class not supported"));
}
}
}
}

  从上面的代码中可以发现实际上我们只是从ConsoleCallbackHandler中去除了那些提示用户输入的代码。

  在运行这个JSP例子的时候,我们需要设定系统属性,这样LgoinContext对象才知道如何查找名称为"Example"的配置。我们使用的是Resin服务器。在resin.conf中,我们增加了一个<caucho.com>节点:

<system-property
java.security.auth.login.config="/resin/conf/jaas.config"/>

   小结

  JAAS通过提供动态的、可扩展的模型来进行用户验证和控制权限,从而使应用程序有更加健壮的安全机制。同时它还能够让你能够很轻松地创建自己的登录机制。JAAS可以同时在在客户端和服务器端应用程序上工作。虽然在服务器端的JAAS到目前还不是很稳定,但是随着技术的发展,相信会很好地解决这个问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值