【问题标题】:Shouldn't a JDBC realm authentication work with a single table?JDBC 领域身份验证不应该与单个表一起使用吗?
【发布时间】:2013-03-14 02:30:23
【问题描述】:

我正在尝试在 Glassfish 3.1 中设置一个非常基本的 JDBC 领域身份验证。该应用程序由一个具有一种业务方法的 EJB 和一个远程客户端应用程序(不是 Web 应用程序)组成。我想我在这里遗漏了一些基本的东西。

我已经按照 Java EE 6 教程完成了所有步骤。我没有收到任何错误,但它从不接受正确的用户名和密码。我最好的猜测是用于身份验证的表的结构可能存在问题,因为我正在尝试使用单个表来存储用户和组。 (比我知识渊博的人在另一篇文章中提到这是可能的,官方教程也使用单个表。我的所有用户都将在一个组中('users'),所以我不想创建一个第二个表。我想让应用程序尽可能简单。)

我有一个数据库('auth')和一个表('ACCOUNTS'),它有 3 个字段:'NAME' 是主键,'PASSWORD' 和 'GROUPS'。我对桌子没有任何限制。

我添加了一个用户:

INSERT INTO ACCOUNTS (NAME, PASSWORD, GROUPS) VALUES ('Bob', 'bob', 'users');

我的 glassfish-application.xml 具有指定的角色映射和领域:

<glassfish-application>
  <security-role-mapping>
    <role-name>users</role-name>
    <group-name>users</group-name>
  </security-role-mapping>
  <realm>jdbcRealm</realm>
</glassfish-application>

领域设置:(Glassfish screenshot)

Realm Name: jdbcRealm
JAAS Context: jdbcRealm
User Table: auth.ACCOUNTS
User Name Column: name
Password Column: password
Group Table: auth.ACCOUNTS
Group Name Column: groups

豆子:

@Stateless
@DeclareRoles("users") 
public class ProtectedBean implements ProtectedBeanRemote {
    private static final Logger logger = Logger.getLogger(ProtectedBean.class.getName());

    @Override
    @RolesAllowed("users")
    public void doProtectedStuff() {
        logger.log(Level.INFO, "Protected method accessed.");
    }

}

JDBC 连接池和资源也被创建。

当我从远程客户端调用 bean 时,会出现登录提示。我输入名称和密码,然后我得到一个 SecurityException:

javax.security.auth.login.LoginException: Security Exception
    at javax.security.auth.login.LoginContext.invoke(LoginContext.java:870)
    ...
Caused by: java.lang.SecurityException
    at javax.security.auth.login.LoginContext.invoke(LoginContext.java:871)

在此之后,登录窗口再次出现,就像名称/密码错误时一样。当我使用 file 领域时,它可以完美运行,但不适用于 jdbc 领域。

表应该不同吗? (我应该使用多个表吗?)还是我做错了什么?提前致谢!

【问题讨论】:

  • 是的,jdbcRealm 甚至可以使用单个表。您显示的设置看起来不错。您可能在 jdbc 资源定义或 web.xml 中有错误
  • 我仔细检查了 jdbc 资源,但我没有 web.xml,因为正如我所说,我有一个独立的客户端应用程序。我仍然不知道问题是什么,但现在我知道至少数据库设置是可以的。感谢阅读。

标签: java security jakarta-ee glassfish jdbcrealm


【解决方案1】:

组名的值应为大写

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多