我有这种情况:登录表单使用DatabaseServerLoginModule
-所有身份验证数据都存储在数据库中的分隔表中,我需要将标志j_usertype
[从下拉列表]传递给j_security_check
可以DatabaseServletLoginModule
在表之间切换并带来特定用户的标志。
有任何想法吗....?
您可以轻松地向登录表单添加更多参数。当然,您需要编写自己的登录模块。然后问题是将添加的参数放入登录模块!
没有符合标准的方法来添加额外的参数j_security_check
(这是一种耻辱 - 很多人都需要这样做)。
但是,有一种巧妙的方法可以达到同样的效果。有一个晦涩但有用的安全规范,称为容器的 Java 授权合同(JACC)。它做了很多事情;一个更晦涩难懂的问题是,它为您提供了一种从调用堆栈中的任何位置访问与当前请求相关的各种对象的方法。您可以使用PolicyContext
具有静态方法的类来执行此操作getContext
。这从由字符串键标识的“策略上下文处理程序”中获取对象。规范中需要一些这样的处理程序,包括:
4.6.1.3 HttpServletRequest 策略上下文处理程序
所有 Servlet 容器都必须注册一个 PolicyContextHandler,其 getContext 方法在使用键“javax.servlet.http.HttpServletRequest”调用时返回一个 javax.servlet.http.HttpServletRequest 对象。当这个handler被激活时,容器必须返回与容器正在处理的组件请求对应的HttpServletRequest对象。
把它放在一起,你可以这样做:
HttpServletRequest request = (HttpServletRequest)PolicyContext.getContext("javax.servlet.http.HttpServletRequest")
一旦你有了HttpServletRequest
,你可以很容易地用 . 获取任意请求参数getParameter
。
我有责任指出,我不是第一个提出这个建议的人。该答案还表明了更好的形式:
HttpServletRequest request = (HttpServletRequest)PolicyContext.getContext(HttpServletRequest.class.getName())