понедельник, 11 мая 2009 г.

JDBC Realm в glassfish

Сегодня удачно создал и использовал jdbc realm в сервере приложений glassfish. Хотя возможность использовать такой тип realm`ов в glassfish`е появилась давно, отмечу скудную и запутанную документированность этой очень полезной фичи.

Начнем с того, что создадим таблички для 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 любым авторизованным пользователям

четверг, 7 мая 2009 г.

инкрементальные бэкапы в ZFS


на днях приобрел себе usb-потоскунчик с целью сделать резервное копирование некоторых данных с жесткого диска
вот небольшая демонстрация большого процесса...

для начала я подключил диск в usb разъем и убедился что он определился в системе
ddosia@twilight:~# iostat -En
...
c6t0d0 Soft Errors: 0 Hard Errors: 0 Transport Errors: 0
Vendor: StoreJet Product: Transcend Revision: Serial No: Size: 250.06GB <250059350016>
Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0
Illegal Request: 0 Predictive Failure Analysis: 0
...


среди прочего мы узнали как он определился в системе.
далее создадим новый пул:

ddosia@twilight:~# zpool create bpool c6t0d0


проверим что он появился:

ddosia@twilight:~# zpool list


создадим на нем новый датасет:

ddosia@twilight:~# zfs create bpool/backup


создадим снапшот нужного нам датасета:

ddosia@twilight:~# zfs snapshot rpool/export/home/ddosia@06052009


далее скопируем получившийся снапшот в новый пул:

ddosia@twilight:~# zfs send rpool/export/home/ddosia@06052009 | zfs receive bpool/backup/ddosia@06052009


на следующий день я решил сделать еще один бэкап (все-таки пятница на носу, плавно перерастающая в праздники ;-) ):

ddosia@twilight:~# zfs snapshot rpool/export/home/ddosia@07052009
ddosia@twilight:~# zfs list -t snapshot
...
rpool/export/home/ddosia@06052009 751M - 50,6G -
rpool/export/home/ddosia@07052009 0 - 51,0G -
...

посылаем новый снапшот:

ddosia@twilight:~# zfs send -i rpool/export/home/ddosia@06052009 rpool/export/home/ddosia@07052009 | zfs receive bpool/backup/ddosia


далее отключаем usb-потаскунчик:

ddosia@twilight:~# zpool export bpool