2012-02-12 85 views
3

我使用JEE6安全注解@RolesAllowed("Admin")和编程登录:如何模拟/模拟/绕过JEE6容器管理登录?

FacesContext context = FacesContext.getCurrentInstance(); 
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); 
request.login(loginUser.getUserName(), loginUser.getPassword()); 

然而,对于测试,我希望能够“模拟”用户登录,并傻瓜,一个用户登录的应用而不是实际执行上面的代码。 request.login(...)将ping容器进行登录,我只想告诉容器foo用户已经登录,并且不需要检查密码。我真的不想要一个涉及编写登录模块或更改整个容器设置的解决方案。

谢谢你们!

编辑#1:我正在使用什么appserver?

我正在使用GlassFish 3.1.1。但是,如果可能的话,我想要一个使用任何可用的JEE6 API的“独立于容器”的解决方案。编辑#2:Balus先生(一位广受好评的专家)不了解任何绕过实际登录的api中立方式。我想我可以编写自己的“Yes-Man”登录模块,但我很好奇,如果有人知道如何绕过GlassFish环境中的限制。

谢谢!

编辑#3:对于后来发现这个问题的任何人,我切换到Apache Shiro。我过去使用过Spring Security,但对于这个应用程序来说这太过分了。

+0

什么程序。你使用的服务器/容器? – szhem 2012-02-12 19:41:54

回答

1

没有API提供的设施。您可以创建一个Filter,它检查某个VM参数或环境变量,甚至是一个JNDI变量,然后自动执行登录。

E.g.

String login = System.getProperty("development.login"); 

if (login != null && request.getRemoteUser() == null) { 
    String[] nameAndPassword = login.split(":"); // Assuming "name:password". 
    request.login(nameAndPassword[0], nameAndPassword[1]); 
} 
+0

好吧。那么Glassfish中的非API应用程序如何? – 2012-02-13 01:35:19

+0

没有想到。您也可以考虑创建一个基于“记住我”功能的cookie(您的web应用程序的最终用户最终也可以从中受益)。这只是一点点工作,需要你真正理解安全影响(或者你可能想要寻找第三方框架,比如Spring Security)。上面的过滤器例子非常简单。只需在dev环境中设置VM参数即可。我甚至看到了远程地址请求被测试的方法(我个人不相信)。 – BalusC 2012-02-13 04:54:47

+0

我过去大量使用SpringSecurity ...我试图做一个纯粹的JEE应用程序,但它看起来像安全性有很多缺点。 :( – 2012-02-13 05:08:28