Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Jaas, простейший пример 
:(
    Опции темы
garbuz
Дата 6.1.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Начал читать книгу по jaas. Вместе с книгой идут исходники всех проектов из книги, которые запросто импортируются в эклипс.  Все примеры запускаются из ant скрипта, каждый target запускает соответствующий пример. Так вот, дошел до первого простейшего примера, все запустил, все работает. Затем решил выдрать этот примерчик в отдельный проект. Вот тут и возникли проблемы. 
Вот сам код 
Код

public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("C:\\java\\cheese.txt");
        try {
            file.canWrite();
            System.out.println("We can write to cheese.txt");
        } catch (SecurityException e) {
            System.out.println("We can NOT write to cheese.txt");
        }
    }
}

Есть еще policy файл с пермишшенами
Код

grant
{
  permission java.io.FilePermission "cheese.txt", "write";
}; 


Запускаю из-под эклипса задав VM parameters, которые указаны в ant-скрипте.
Код

-Djava.security.manager; -Djava.security.policy=C:\java\chp02a.policy


Изменение файла policy ни к чему не приводит, хотя должно, я имею ввиду изменение "write" на  "read", если такие изменения производить с файлом, который относится к проекту из книги, то там эти изменения действуют сразу.
Такое чувство, что то-ли параметры не воспринимаются, то ли я где-то сильно затупил. Прошу помощи.

PM MAIL   Вверх
ivg
Дата 6.1.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Код

-Djava.security.manager
 точку с запятой в конце уберите. Ну и полный путь
Код

grant {
  permission java.io.FilePermission "C:/java/cheese.txt", "write";
}; 
 или маски
Код

grant {
  permission java.io.FilePermission "C:/-", "read";
}; 

PM MAIL   Вверх
garbuz
Дата 6.1.2009, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



ivg, спасибо большое! Все получилось! Тему не закрываю, боюсь, что еще будет не один вопрос smile
PM MAIL   Вверх
garbuz
Дата 12.1.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Неспешно добрался до второго примера и тут тоже возникли непонятки. Так же как и раньше (см. выше) вынес приложение из общего в отдельное. Приложение уже больше похоже на приложение, тут используюстся LoginModule, CallbackHandler, Principals. Вот небольшое описание
Цитата

In the second example, we’re interested in protecting JAAS itself from being hacked by users
of the application it’s protecting. For simplicities sake, the example won’t protect JAAS
from all possible attempts to hack it. Rather, the example will focus on simply protecting
access to the Policy file. The Policy file specifies which permissions logged in users, and
the application in general, are granted. Any user that can modify the Policy file can
potentially grant themselves all permissions, compromising the security of the system. Thus,
restricting access to the Policy file is very important.
The example system will have two types of users: normal users and systems
administrators:
• Normal users cannot access the Policy file.
• Only system administrators will be allowed to modify the Policy file. Normal users
will not.
A Principal will represent each of these users. The Policy file will declare which
permissions each Principal, and thus user, is given. The “application” will be represented by a
small class with a main method. The application will log each type of user in, and then
attempt to access the Policy file to demonstrate how access is both checked and restricted
with JAAS.


Итак, что у нас есть.
Main
Код

public class Main {
    public static void main(String[] args) throws Exception {
        File policyFile = new File("C:/java/chapter2/chp02.policy");
        testAccess(policyFile, "sysadmin", "password");
        testAccess(policyFile, "user", "password");

    }

    static void testAccess(final File policyFile, final String username,
            final String password) throws LoginException {
        // Login a user
        SimpleCallbackHandler cb = new SimpleCallbackHandler(username, password);
        LoginContext ctx = new LoginContext("chp02", cb);
        ctx.login();
        Subject subject = ctx.getSubject();
        System.out.println("Logged in " + subject);

        // Create privileged action block which limits permissions
        // to only the Subject's permissions.
        try {
            Subject.doAsPrivileged(subject, new PrivilegedAction() {

                public Object run() {
                    policyFile.canRead();
                    System.out.println(username + " can access Policy file.");
                    return null;
                }
            }, null);
        } catch (SecurityException e) {
            System.out.println(username + " can NOT access Policy file.");
        }

    }
}


наш CallbackHandler
Код

public class SimpleCallbackHandler implements CallbackHandler {

  private String name;
  private String password;

  public SimpleCallbackHandler(String name, String password) {
    this.name = name;
    this.password = password;
  }

  public void handle(Callback[] callbacks) {
    for (int i = 0; i < callbacks.length; i++) {
      Callback callback = callbacks[i];
      if (callback instanceof NameCallback) {
        NameCallback nameCB = (NameCallback) callback;
        nameCB.setName(name);
      } else if (callback instanceof PasswordCallback) {
        PasswordCallback passwordCB = (PasswordCallback) callback;
        passwordCB.setPassword(password.toCharArray());
      }
    }

  }
}


SimpleLoginModule
Код

public class SimpleLoginModule implements LoginModule {

  private Subject subject;
  private CallbackHandler callbackHandler;
  private String name;
  private String password;

  public void initialize(Subject subject,
      CallbackHandler callbackHandler, Map sharedState, Map options) {
    this.subject = subject;
    this.callbackHandler = callbackHandler;
  }

  public boolean login() throws LoginException {
    // Each callback is responsible for collecting a credential
    // needed to authenticate the user.
    NameCallback nameCB = new NameCallback("Username");
    PasswordCallback passwordCB = new PasswordCallback("Password",
        false);
    Callback[] callbacks = new Callback[] { nameCB, passwordCB };
    // Delegate to the provided CallbackHandler to gather the
    // username and password.
    try {
      callbackHandler.handle(callbacks);
    } catch (IOException e) {
      e.printStackTrace();
      LoginException ex = new LoginException(
          "IOException logging in.");
      ex.initCause(e);
      throw ex;
    } catch (UnsupportedCallbackException e) {
      String className = e.getCallback().getClass().getName();
      LoginException ex = new LoginException(className
          + " is not a supported Callback.");
      ex.initCause(e);
      throw ex;
    }

    // Now that the CallbackHandler has gathered the username and password,
    // use them to authenticate the user against the expected passwords.
    name = nameCB.getName();
    password = String.valueOf(passwordCB.getPassword());

    if ("sysadmin".equals(name) && "password".equals(password)) {
      // login in sysadmin
      return true;
    } else if ("user".equals(name) && "password".equals(password)) {
      // login user
      return true;
    } else {
      return false;
    }
  }

  public boolean commit() {
    // If this method is called, the user successfully authenticated, and
    // we can add the appropriate Principles to the Subject.
    if ("sysadmin".equals(name)) {
      Principal p = new SysAdminPrincipal(name);

      subject.getPrincipals().add(p);
      password = null;
      return true;
    } else if ("user".equals(name)) {
      Principal p = new UserPrincipal(name);
      subject.getPrincipals().add(p);
      password = null;
      return true;
    } else {
      return false;
    }
  }

  public boolean abort() {
    name = null;
    password = null;
    return true;
  }

  public boolean logout() {
    name = null;
    password = null;
    return true;
  }

}


Ну и два класса Principals, которые особой важности пока не имеют.

Помимо этих классов существуеют так же два файла: 
1) policy файл с правами доступа 
Код

grant Principal com.test.UserPrincipal "user"
{
 // not granted anything
}; 

grant Principal com.test.SysAdminPrincipal "sysadmin"
{
  permission java.io.FilePermission "C:/java/chapter2/chp02.policy", "read";
}; 


grant codeBase "file://C:/java/chapter2" 
{
  permission javax.security.auth.AuthPermission "modifyPrincipals";
  permission javax.security.auth.AuthPermission "modifyPublicCredentials";
  permission javax.security.auth.AuthPermission "modifyPrivateCredentials";
  permission javax.security.auth.AuthPermission "createLoginContext.*";
  permission javax.security.auth.AuthPermission "doAs";
  permission javax.security.auth.AuthPermission "doAsPrivileged";
  permission java.security.SecurityPermission "setPolicy";
  permission java.security.SecurityPermission "getPolicy";
  permission java.lang.RuntimePermission "accessClassInPackage.sun.security.provider";
  permission java.lang.RuntimePermission "getProtectionDomain";
};


2) Проперти файл для LoginContext

Код

chp02
 {
    com.test.SimpleLoginModule REQUIRED;
 };



Короче как ни пытался запустить - ничего не вышло, кидает
Код

Exception in thread "main" java.security.AccessControlException: Access denied (javax.security.auth.AuthPermission createLoginContext.chp02)
    at java.security.AccessController.checkPermission(AccessController.java:108)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:548)
    at javax.security.auth.login.LoginContext.init(LoginContext.java:247)
    at javax.security.auth.login.LoginContext.<init>(LoginContext.java:426)
    at com.test.Main.testAccess(Main.java:26)
    at com.test.Main.main(Main.java:17)



Если запускать не из отдельно проекта, а из общего из книги через ant, то все равно такая же картина :(
Возможно опять где-то что-то не усмотрел. Заранее спасибо! 
PM MAIL   Вверх
ivg
Дата 12.1.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



1. Если содержимое policy файла, которое вы привели находится в файле C:/java/chapter2/chp02.policy, тогда аргументы для запуска JVM
Код
-Djava.security.manager -Djava.security.policy=C:/java/chapter2/chp02.policy

2. Исправьте 12-ю строку policy файла
Цитата(garbuz @  12.1.2009,  19:39 Найти цитируемый пост)
Код
grant codeBase "file://C:/java/chapter2"

на 
Цитата
grant codeBase "file:/<путь к скомпилированному классу com.test.Main>"
, например для классов в проекте эклипсы у меня это выглядит
Код
grant codeBase "file:/D:/workspace/test/bin"
 можно 
Код
grant codeBase "file:/D:/workspace/test/-"
, ну или на крайний случай вообще 
Код
grant codeBase "file:/-"

3. Содержимое 
Цитата(garbuz @  12.1.2009,  19:39 Найти цитируемый пост)
Проперти файл для LoginContext
, у меня находится в файле ${user.home}/.java.login.config

Это сообщение отредактировал(а) ivg - 12.1.2009, 21:35
PM MAIL   Вверх
garbuz
Дата 13.1.2009, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Цитата(ivg @  12.1.2009,  21:30 Найти цитируемый пост)
1. Если содержимое policy файла, которое вы привели находится в файле C:/java/chapter2/chp02.policy, тогда аргументы для запуска JVM
Код

-Djava.security.manager -Djava.security.policy=C:/java/chapter2/chp02.policy



Совсем забыл указать параметры запуска, вот они!
Код

-Djava.security.manager 
-Djava.security.auth.login.config=C:\java\chapter2\chp02-loginmodules.properties
-Djava.security.policy=C:\java\chapter2\chp02.policy

ivg, спасибо за помощь, сейчас буду разбираться smile


PM MAIL   Вверх
ivg
Дата 13.1.2009, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(garbuz @  13.1.2009,  02:21 Найти цитируемый пост)
параметры запуска, вот они!

Ну в таком случае остаётся лишь поправить 12-ю строку.
PM MAIL   Вверх
garbuz
Дата 13.1.2009, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Цитата(ivg @  13.1.2009,  00:39 Найти цитируемый пост)
Ну в таком случае остаётся лишь поправить 12-ю строку. 

Поправил на
Код

grant Principal com.test.UserPrincipal "user"
{
 // not granted anything
}; 

grant Principal com.test.SysAdminPrincipal "sysadmin"
{
  permission java.io.FilePermission "C:/java/chapter2/chp02.policy", "read";
}; 


grant codeBase "file://C:/Documents and Settings/garbuz/workspace/chapter2_task2/bin/com/test" 
{
  permission javax.security.auth.AuthPermission "modifyPrincipals";
  permission javax.security.auth.AuthPermission "modifyPublicCredentials";
  permission javax.security.auth.AuthPermission "modifyPrivateCredentials";
  permission javax.security.auth.AuthPermission "createLoginContext.*";
  permission javax.security.auth.AuthPermission "doAs";
  permission javax.security.auth.AuthPermission "doAsPrivileged";
  permission java.security.SecurityPermission "setPolicy";
  permission java.security.SecurityPermission "getPolicy";
  permission java.lang.RuntimePermission "accessClassInPackage.sun.security.provider";
  permission java.lang.RuntimePermission "getProtectionDomain";
};

тот же эксепшн  smile 
PM MAIL   Вверх
ivg
Дата 13.1.2009, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Код

grant codeBase "file:/C:/Documents%20and%20Settings/garbuz/workspace/chapter2_task2/bin"


PM MAIL   Вверх
garbuz
Дата 13.1.2009, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



ivg, приедешь в Питер, с меня ящик пива! Спасибо большое!!!  smile 
PM MAIL   Вверх
garbuz
Дата 13.1.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Пока не взялся за следующую главу книги, хочу выяснить некоторые вещи:

1) Если будет веб приложение, которое крутится на томкате, что лучше юзать для аутен\авторизац в приложении, встроенные стредства томката или jaas?
2) Насколько хороши встроенные стредства томката? Позволяет ли томкат использовать для авторизации бд, или же только свой tomcat-users.xml
3) В томкате аутен\авторизац только через ssl или же нет?
4) Короче в голове пока какая-то каша, может кто попробует разложить по полочкам? smile
PM MAIL   Вверх
ivg
Дата 14.1.2009, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(garbuz @  13.1.2009,  21:48 Найти цитируемый пост)
Позволяет ли томкат использовать для авторизации бд

Да.
Цитата(garbuz @  13.1.2009,  21:48 Найти цитируемый пост)
В томкате аутен\авторизац только через ssl или же нет?

Нет. Просто, по хорошему, аутентификация должна проходить по защищённому соединению.
PM MAIL   Вверх
garbuz
Дата 14.1.2009, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Пока еще по ссылке не прочитал.
Хочу спросить еще Realm это совершенно отдельная часть от jaas? Если да, то в какую сторону лучше копать? Какие у кого преимущества?

PM MAIL   Вверх
garbuz
Дата 24.2.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Вот опять немного свободно времени выдалось, сел ковырять jaas дальше.
Есть вопросы по LoginModule, в частности по методу commit()
По имени пользователя создается credential - объект 
Код

public class UsernameCredential {
  private String name;

  public UsernameCredential(String name) {
    if (name == null || name.length() == 0) {
      throw new NullPointerException(
          "User group name may not be empty.");
    }
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public boolean equals(Object obj) {
    if (!(obj instanceof UsernameCredential)) {
      return false;
    }
    UsernameCredential other = (UsernameCredential) obj;
    return getName().equals(other.getName());
  }

  public int hashCode() {
    return getName().hashCode();
  }

}


Затем этот объект добавляется в объект subject к общим credentials.
Код

// set credential
        UsernameCredential cred = new UsernameCredential(username);
        subject.getPublicCredentials().add(cred);


Креденшинал объект, насколько я понял, это объект, содержащий идентифицирующие пользователя данные, например логин и пароль, ну или одно из них. Верно? или я ошибаюсь? Вопрос: для чего они нам дальше могут потребоваться? 

Дальше в этом методе получают объекты типа Principal, например такой
Код

public class UserGroupPrincipal implements Principal {
  private String name;

  public UserGroupPrincipal(String name) {
    if (name == null || name.length() == 0) {
      throw new NullPointerException(
          "User group name may not be empty.");
    }
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public boolean equals(Object obj) {
    if (!(obj instanceof UserGroupPrincipal)) {
      return false;
    }
    UserGroupPrincipal other = (UserGroupPrincipal) obj;
    return getName().equals(other.getName());
  }

  public int hashCode() {
    return getName().hashCode();
  }

}


Потом набор этих principals добавляется в объект subject.
Код

subject.getPrincipals().addAll(principals);


В чем смысл этих principals. Для чего они надо? В чем отличие от Credential? Короче в голове вообще какая-то каша!

В доках томката в описании JAASRealm написано
Цитата

userClassNames    
A comma-seperated list of the names of the classes that you have made for your user Principals.

roleClassNames    
A comma-seperated list of the names of the classes that you have made for your role Principals.


так вот. Например у меня в базе три вида ролей, как я понимаю надо создать три разных principal - объекта , хотя это зачем непонятно. Различаться они будут только типом (классом) и значением поля name.
А вот с principals для user вообще непонятно. Создавать такой же объект как и для роли, только название класса изменить на UserPrincipal? Что-то я вообще не догоняю.

После всего этого как я понимаю, мне надо будет запустить томкат и в параметрах запуска указать конфиг файл, где указываю к какому приложению какой loginModule применять, верно?




PM MAIL   Вверх
garbuz
Дата 13.3.2009, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Итак, опять я взялся ковырять jaas. Дописал для томката модуль аутентификации, опираясь на пример из книги, хотя книгу до конца еще не просмотрел. Вот что из этого вышло.
Код

public class DbCallbackHandler implements CallbackHandler {
    private String username;
    private String password;

    public DbCallbackHandler(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public void handle(Callback[] callbacks) {
        for (int i = 0; i < callbacks.length; i++) {
            Callback callback = callbacks[i];
            if (callback instanceof NameCallback) {
                NameCallback nameCB = (NameCallback) callback;
                nameCB.setName(username);
            } else if (callback instanceof PasswordCallback) {
                PasswordCallback passwordCB = (PasswordCallback) callback;
                passwordCB.setPassword(password.toCharArray());
            }
        }
    }
}

Код

public class DbLoginModule implements LoginModule {
    private Subject subject;
    private CallbackHandler callbackHandler;
    private Map sharedState = Collections.EMPTY_MAP;
    private Map options = Collections.EMPTY_MAP;
    private Set principalsAdded;
    private boolean authenticated;
    private String username;
    private String password;


    public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) {
        this.subject = subject;
        this.callbackHandler = callbackHandler;
        this.sharedState = sharedState;
        this.options = options;
    }

    public boolean login() throws LoginException {
        NameCallback nameCB = new NameCallback("Username");
        PasswordCallback passwordCB = new PasswordCallback("Password", false);
        Callback[] callbacks = new Callback[]{nameCB, passwordCB};
        try {
            callbackHandler.handle(callbacks);
        } catch (IOException e) {
            LoginException ex = new LoginException("IOException logging in.");
            ex.initCause(e);
            throw ex;
        } catch (UnsupportedCallbackException e) {
            String className = e.getCallback().getClass().getName();
            LoginException ex = new LoginException(className + " is not a supported Callback.");
            ex.initCause(e);
            throw ex;
        }

        // Authenticate username/password
        username = nameCB.getName();
        password = String.valueOf(passwordCB.getPassword());


        // lookup credentials
        String storedPass = DbService.getInstance().getPassByName(username);
        if (storedPass == null && password == null) {
            authenticated = true;
        } else if (storedPass != null
                && storedPass.equals(password)) {
            authenticated = true;
        } else {
            authenticated = false;
        }

        return authenticated;
    }

    public boolean commit() throws LoginException {
        if (!authenticated) {
            return false;
        }

        // set credential
        UsernameCredential cred = new UsernameCredential(username);
        subject.getPublicCredentials().add(cred);

                // lookup user groups, add to Subject
        List principals = DbService.getInstance().getRolesByName(username);
        subject.getPrincipals().addAll(principals);
        principalsAdded = new HashSet();
        principalsAdded.addAll(principals);

        return true;
    }


    public boolean abort() {
        username = null;
        password = null;
        authenticated = false;
        return true;
    }

    public boolean logout() throws LoginException {
        //
        // Remove usergroup principals
        //

        if (principalsAdded != null && !principalsAdded.isEmpty()) {
            subject.getPrincipals().removeAll(principalsAdded);
        }
        return true;
    }

    protected boolean isAuthenticated() {
        return authenticated;
    }

    protected Subject getSubject() {
        return subject;
    }

    protected Set getPrincipalsAdded() {
        return principalsAdded;
    }

    protected String getUsername() {
        return username;
    }

}



Код

public class DbService {

    private static Connection con;
    private static DbService instance;
    private static DataSource dataSource;

    private DbService() {
    }


    public static synchronized DbService getInstance() {
        if (instance == null) {
            try {
                instance = new DbService();
                Context ctx = new InitialContext();
                instance.dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/zeDS");
                con = dataSource.getConnection();
            }
            catch (NamingException e) {
                e.printStackTrace();
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return instance;

    }


    public String getPassByName(String name) {
        try {
            String sql = "select user_pass from users where user_name = ?";
            PreparedStatement stmt = con.prepareStatement(sql);
            stmt.setString(1, name);
            java.sql.ResultSet rs = stmt.executeQuery();
             if (rs.next()) {
                return rs.getString(1);
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return "";
    }

    public List getRolesByName(String name) {
        ArrayList<Principal> roles = new ArrayList<Principal>();
        try {
            String sql = "select role_name from roles_view where user_name = ?";
            PreparedStatement stmt = con.prepareStatement(sql);
            stmt.setString(1, name);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                String roleName = rs.getString("role_name");
                RolePrincipal rolePrincipal = new RolePrincipal(roleName);
                roles.add(rolePrincipal);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return roles;
    }
}



Код

public class RolePrincipal implements Principal {

    private String name;

    public RolePrincipal(String name) {
        if (name == null || name.length() == 0) {
            throw new NullPointerException("User group name may not be empty.");
        }
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public boolean equals(Object obj) {
        if (!(obj instanceof RolePrincipal)) {
            return false;
        }
        RolePrincipal other = (RolePrincipal) obj;
        return getName().equals(other.getName());
    }

    public int hashCode() {
        return getName().hashCode();
    }

}



Код

public class UserPrincipal implements Principal {

    private String name;

    public UserPrincipal(String name) {
        if (name == null || name.length() == 0) {
            throw new NullPointerException("User group name may not be empty.");
        }
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public boolean equals(Object obj) {
        if (!(obj instanceof UserPrincipal)) {
            return false;
        }
        UserPrincipal other = (UserPrincipal) obj;
        return getName().equals(other.getName());
    }

    public int hashCode() {
        return getName().hashCode();
    }

}


Код

public class UsernameCredential {
    private String name;

    public UsernameCredential(String name) {
        if (name == null || name.length() == 0) {
            throw new NullPointerException(
                    "User group name may not be empty.");
        }
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public boolean equals(Object obj) {
        if (!(obj instanceof UsernameCredential)) {
            return false;
        }
        UsernameCredential other = (UsernameCredential) obj;
        return getName().equals(other.getName());
    }

    public int hashCode() {
        return getName().hashCode();
    }
}



В конфигах томката
Код

<Realm className="org.apache.catalina.realm.JAASRealm"
           dataSourceName="jdbc/zeDS"
           localDataSource="true"
           userClassNames="com.jaas.UserPrincipal"
           roleClassNames="com.jaas.RolePrincipal"
           debug="99"/>



Аутентификация проходит нормально, все вроде бы работает. Однако у меня остались все те же вопросы.
1) Как мне использовать созданные Principals? 
2) Надо ли их вообще использовать?
3) Как ограничивать какой-либо доступ куда-либо? Это делается с помощью описания policy файла как я понимаю?
4) Зачем это делать через policy, если это действеительно надо, если у меня все прописано в web.xml
Код

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>My App</web-resource-name>
            <url-pattern>/upload</url-pattern>
            <url-pattern>/download</url-pattern>
            <url-pattern>/upload.jsp</url-pattern>
            <url-pattern>/about.jsp</url-pattern>
            <url-pattern>/about</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>operator</role-name>
            <role-name>admin</role-name>
        </auth-constraint>
    </security-constraint>


5) Для чего нам нужет объек UsernameCredential? Как в дальнейшем и для чего его можно использовать?
6) Еще вопрос по поводу Prinsipals. Если например у меня несколько возможных ролей. Для каждой роли надо описывать соответствеющий Principal-класс и потом в policy для каждого principals описывать права доступа? Или же тут можно обойтись одним классом, и работать с полем name? Как в этом случае быть не с ролями, а с юзерами?
7) Был ли у кого-нибудь реальный опыт работы с jaas? Может кто ответит на мои вопросы  smile 
8) Может кто приведет свой реальный пример использования jaas?

Заранее спасибо!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1087 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.