我有这个案子:
登录表单使用DatabaseServerLoginModule
- 所有身份验证数据都存储在Seperated Tables中的数据库中我需要将j_usertype
[从下拉列表]传递到j_security_check
DatabaseServletLoginModule
{{1}}在表之间切换并带给特定用户。
任何想法......?
答案 0 :(得分:1)
您可以轻松地向登录表单添加更多参数。当然,您需要编写自己的登录模块。问题是将添加的参数添加到登录模块中!
没有符合标准的方法来向j_security_check
添加额外的参数(这很遗憾 - 很多人都需要这样做)。
但是,有一种狡猾的方法可以达到同样的效果。有一个名不见经传但有用的安全规范称为Java Authorization Contract for Containers(JACC)。它做了很多事情;其中一个比较模糊和可疑的是,它为您提供了一种从调用堆栈中的任何位置访问与当前请求相关的各种对象的方法。您可以使用PolicyContext
类执行此操作,该类具有静态方法getContext
。这从字符串键标识的“策略上下文处理程序”中获取对象。规范中需要一些这样的处理程序,包括:
4.6.1.3 HttpServletRequest策略上下文处理程序
所有Servlet容器必须注册一个PolicyContextHandler,当使用键“javax.servlet.http.HttpServletRequest”调用时,其getContext方法返回一个javax.servlet.http.HttpServletRequest对象。激活此处理程序时,容器必须返回与容器正在处理的组件请求相对应的HttpServletRequest对象。
将它们放在一起,你可以做到:
HttpServletRequest request = (HttpServletRequest)PolicyContext.getContext("javax.servlet.http.HttpServletRequest")
获得HttpServletRequest
后,您可以使用getParameter
轻松获取任意请求参数。
我有责任指出i am not the first person to suggest this。这个答案也表明了稍微好一点的形式:
HttpServletRequest request = (HttpServletRequest)PolicyContext.getContext(HttpServletRequest.class.getName())