我正在尝试在Glassfish 3.1中设置一个非常基本的JDBC领域身份验证。该应用程序包含一个带有一种业务方法的EJB和一个远程客户端应用程序(不是webapp)。我想我在这里缺少一些基本的东西。
我已经按照Java EE 6教程完成了所有步骤。我没有收到任何错误,但它从未接受正确的用户名和密码。我最好的猜测是,用于身份验证的表的结构可能存在问题,因为我正在尝试使用单个表来存储用户和组。 (在另一篇文章中,有人比我更了解这是可能的,官方教程也使用单个表。我的所有用户都在一个组('用户'),所以我宁愿不创建一个第二个表。我想让应用程序尽可能简单。)
我有一个带有一个表('ACCOUNTS')的数据库('auth'),它有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>
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域。
桌子应该不同吗? (我应该使用多个表吗?)或者我做错了什么?提前致谢!
答案 0 :(得分:0)
组名的值应为大写