Дизайн безопасности Spring and Stripes - PullRequest
2 голосов
/ 13 мая 2009

Я создаю веб-приложение, используя Stripes и Spring. Он должен иметь функцию входа в систему / аутентификации. Прямо сейчас я храню информацию о пользователе отдельно от учетных данных пользователя в базе данных. Моя модель User не содержит учетных данных, так как я не хочу передавать ценные пароли.

Spring управляет всеми моими DAO.

Сейчас я внедряю неконтейнерную систему безопасности. Я храню хэш-пароль sha-2 и сравниваю пароль, который был представлен в форме, с тем, что хранится в базе данных. Это сравнение было проверено и работает. Я пытаюсь выяснить, как соединить эту вещь вместе. Прямо сейчас у меня есть LoginActionBean, который перехватывает запросы на вход в систему и использует синглтон PasswordService, который использует UserDAO для извлечения учетных данных и сравнения их параметров. Моя фасоль:

<bean id="passwordSerivce" class="com.example.store.authentication.PasswordService" factory-method="getInstance">
    <property name="userDAO" ref="userDAO"/>
</bean>

Но тогда синглтон PasswordService нуждается в:

public void setUserDAO(UserDAO userDAO) { ...}

метод, который на самом деле не имеет смысла в синглтоне (UserDAO - это интерфейс).

Я ищу правильный дизайн. Я читал, что ServiceLocators - это та самая причина, по которой Spring был изобретен. Есть мысли?

Я также хотел бы знать, как еще я могу создать это. У меня есть ActionBean, который вызывается, когда пользователь нажимает «Войти», но как мне на самом деле пройти аутентификацию. Внедрить ли сервис аутентификации в компонент? Создаю ли я синглтон, который каждый может назвать? Есть ли у меня общий интерфейс, который LoginAcionBean использует, который внедряет Spring? Если бы я не использовал Spring, как бы это было сделано?

Ответы [ 3 ]

1 голос
/ 13 мая 2009

В дополнение к ответу выше, просто используйте инъекцию конструктора, если вы не хотите использовать установщик для DAO:

<bean id="passwordSerivce" class="...PasswordService">
   <constructor-arg ref="userDAO"/>
</bean>

Если бин не является классом, которым вы управляете, вам не нужно делать его Singleton, Spring сделает это по умолчанию.

Лично я не фанат аннотаций.

1 голос
/ 13 мая 2009
  1. Я не понимаю, почему нет смысла вводить userDao.

  2. Я не понимаю, почему ваш xml использует factory-method = "getInstance"; вы можете выбросить все вещи экземпляра и синглтон; Spring создаст экземпляр одного экземпляра класса обслуживания паролей и внедрит его во все классы, в которых это необходимо, и все они получат один и тот же экземпляр. Так что весна создает для тебя синглтон. Класс обслуживания паролей может быть простым pojo. Аналогично для реализации userDao.

Я бы также посоветовал смотреть, понимать и использовать весенние аннотации. В основном вы используете @Service для класса, который будет введен, а затем используйте @Autowired для установщика в классе, в который он вводится. Вам также нужно добавить что-то в файл конфигурации xml, чтобы включить аннотации.

0 голосов
/ 16 мая 2009

Мое решение состояло в том, чтобы иметь интерфейс с методом «authenticate». Затем создайте класс обслуживания, который реализует интерфейс с помощью конструктора, который принимает объект UserDAO. Таким образом, объект, которому требуется служба, не выполняет создание экземпляров (это делается весной) и не знает, какая базовая реализация выполняется (ldap, SSO, сравнение простых паролей и т. Д.). Кажется, чтобы сделать работу: P

...