JDBC 领域认证不应该对单个表起作用吗?



我试图在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截图)

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

bean:

@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领域。

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

组名的值应该是大写

相关内容

  • 没有找到相关文章

最新更新