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")
关于什么是错的任何想法?
答案 0 :(得分:1)
从管理控制台禁用安全管理器选项,然后保存并重新启动服务器。
您可以在配置 - &gt;中找到此选项。 server-config - &gt;安全的
如果要求安全管理员启用。通过在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:
server.policy
位于[domain_dir]/config/
[domain_dir]
和[application_name]
将替换为您自己的域名目录和应用程序名称