HttpServletRequest登录方法不起作用

时间:2014-01-28 17:32:12

标签: jsf authentication glassfish

Hy大家, 我想用jsf实现编程认证。 我已经配置了glassfish身份验证领域,并在web.xml中设置:

  <login-config>
<auth-method>FORM</auth-method>
<realm-name>authJdbcRealm</realm-name>
<form-login-config>
        <form-login-page>/home.xhtml</form-login-page>
        <form-error-page>/loginError.xhtml</form-error-page>
</form-login-config>
</login-config>

home.xhtml有一个表单,使用以下方法作为操作属性访问托管bean:

public String login()
{
    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext externalContext = context.getExternalContext();
    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
      {
            request.login(customer.getUsername(),customer.getPassword());

        }
        catch (ServletException e) 
        {
            errorMessage(e.toString(),e.getMessage());
        } 
            return null;}

getPassword()返回纯文本(不是sha256-digest,应该由auth领域执行)。虽然j_security_check表单没有问题,但是以编程方式我总是得到一个ServeletException,使用这个StackTrace:

INFO: JACC Policy Provider: Failed Permission Check,
context(TravelDream/TravelDreamWeb_war)-
permission(("javax.security.auth.AuthPermission" "createLoginContext.jdbcRealm"))
WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException:
Login failed: access denied ("javax.security.auth.AuthPermission" "createLoginContext.jdbcRealm")

关于什么是错的任何想法?

1 个答案:

答案 0 :(得分:1)

选项1:

从管理控制台禁用安全管理器选项,然后保存并重新启动服务器。

您可以在配置 - &gt;中找到此选项。 server-config - &gt;安全

选项2:

如果要求安全管理员启用。通过在server.policy中添加新的codeBase来授予对应用程序的权限。即:

grant codeBase "file:[domain_dir]/applications/[application_name]-" {

  permission javax.security.auth.AuthPermission "createLoginContext.jdbcRealm";  
  permission javax.security.auth.AuthPermission "doAsPrivileged";

};

N.B:

  • 请勿从此文件中删除任何内容,只需添加上面显示的权限
  • 即可 {li> server.policy位于[domain_dir]/config/
  • [domain_dir][application_name]将替换为您自己的域名目录和应用程序名称
  • 可以在应用程序服务器文档中找到更多信息 (PDF)Glassfish server application development guide
相关问题