2013-02-27 34 views
1

我有这样的情况: 登录表单使用DatabaseServerLoginModule - 所有的认证数据都存储在分隔表的数据库,我需要通过标志j_usertype [从下拉列表]以j_security_checkDatabaseServletLoginModule能在桌子之间切换并带来特定用户。Java和Jboss7:j_security_check定制实施

有什么想法....?

回答

1

您可以轻松地将更多参数添加到登录表单中。当然,您需要编写自己的登录模块。问题是然后获取添加的参数到登录模块!

没有符合标准的方法来向j_security_check添加额外的参数(这是一个耻辱 - 很多人需要这样做)。

但是,有一个狡猾的方法来实现相同的效果。有一个不起眼但有用的安全规范,称为Java Authorization Contract for Containers(JACC)。它做了很多事情;其中一个比较晦涩难懂的问题是,它使您能够从调用堆栈中的任意位置访问与当前请求相关的各种对象。你可以使用PolicyContext这个类,它有一个静态方法getContext。这从通过字符串键标识的“策略上下文处理程序”中获得对象。一些这样的处理程序中所需的说明书,包括:

4.6.1.3 HttpServletRequest的策略背景信息处理程序

所有Servlet容器必须注册一个PolicyContextHandler其getContext方法调用时返回一个javax.servlet.http.HttpServletRequest对象用“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()) 
+0

好吧然后....但我怎么可以将这些参数在standalone.xml中的jboss 7.x? – 2013-03-02 08:23:17

+0

什么?你是什​​么意思“在standalone.xml中传递这些参数”? – 2013-03-02 09:34:37

+0

哇.... thnx汤姆...哇!我想通了.....我仔细阅读你的答案这是一个欺诈解决方案毕竟hehehehe :) thnx再次.. – 2013-03-02 14:20:46