Начнем с того, что создадим таблички для jdbc-realm`а:
[в качестве операционной системы я использовал - OpenSolaris 5.11 snv_111a, в качестве RDBMS postgresql-8.3 доступный из стандартных репозиториев, сервер приложений Sun GlassFish Enterprise Server v2.1]
для начала я установил нужный jdbc driver для postgresql, (SUNWpostgr-jdbc) и положил его в ${DOMAIN_DIR}/lib/ext
затем создал необходимые таблички, содержащие пользователей и группы в моей БД, вот их структура [структуру табличек глянул здесь]:
CREATE TABLE users (
user_name text,
user_password text NOT NULL,
CONSTRAINT PK_users PRIMARY KEY (user_name)
);
CREATE TABLE roles (
role_caption text,
CONSTRAINT PK_roles PRIMARY KEY (role_caption)
);
CREATE TABLE users_roles (
user_name text,
role_caption text,
CONSTRAINT PK_users_roles PRIMARY KEY (user_name, role_caption),
CONSTRAINT FK_users_roles_0 FOREIGN KEY (user_name) REFERENCES users(user_name),
CONSTRAINT FK_users_roles_1 FOREIGN KEY (role_caption) REFERENCES roles(role_caption)
);
Для опытов внесем туда что-нибудь:
INSERT INTO users VALUES ('ddosia', '63a9f0ea7bb98050796b649e85481845');
INSERT INTO roles VALUES ('root');
INSERT INTO users_roles VALUES ('ddosia', 'root');
далее создадим datasource, способный вытягивать данные из данной БД.
вначале создаем connection-pool при помощи веб-консоли администрирования:
"Resources"->"JDBC"->"Connection Pools":
кнопаем на "New", указываем имя ["pg_local"], resource type ["javax.sql.DataSource"] и database vendor ["PostgreSQL"];
вводим известные нам значения "ServerName", "DatabaseName", "PortNumber", "User", "Password"
"Resources"->"JDBC"->"JDBC Resources":
щелкаем "New", указываем JNDI-Name ["jdbc/pg"], выбираем "Pool Name" ["pg_pool"]
вуаля, пул готов, далее создадим realm, использующий данный пул:
с помошью консоли администрирования glassfish`а идем в "Configuration"->"Security"->"Realms", кнопаем на "New"
указываем имя ["myJDBCRealm"], "Class Name" ["com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm"]
далее заполняем след свойства:
JAAS context ["JDBCRealm"]
JNDI ["jdbc/pg"]
User Table ["users"]
User Name Column ["user_name"]
Password Column ["user_password"]
Group Table ["users_roles"]
Group Name Column ["role_caption"]
Теперь пришел черед самого приложения:
вначале создадим ejb-bean, что то типа:
TestBean.java:
package realmsample;
import javax.annotation.security.PermitAll;
import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
@Stateless (name="TestBean", mappedName="TestRemote")
public class TestBean implements TestRemote {
@RolesAllowed("root")
public String meth1() {
return "11111!!!!";
}
@PermitAll
public String meth2() {
return "22222!!!!";
}
}
TestRemote.java:
package realmsample;
import javax.ejb.Remote;
@Remote
public interface TestRemote {
public String meth1 ();
public String meth2 ();
}
Client.java:
...
try {
InitialContext ctx = new InitialContext();
TestRemote testBean = (TestRemote) ctx.lookup ("TestRemote#" + TestRemote.class.getName());
System.out.println(testBean.meth2());
System.out.println(testBean.meth1());
} catch (NamingException exc) {
exc.printStackTrace();
}
...
так же необходимо в sun-application.xml внести следующее
...
<realm>
myJDBCRealm
</realm>
...
и поставить галочку в "Configuration"->"Security"
"Default Principal To Role Mapping" -> "Enabled"
собственно после того как все это задеплоить и запустить, например через java-web-start или через netbeans то появится диалоговое окно, которое попросит представится системе. После удачной аутентификиции и авторизации meth1 будет выполнятся только тем кто состоит в группе root, а meth2 любым авторизованным пользователям