2009-05-13 5 views
2

줄무늬와 봄을 사용하여 웹 응용 프로그램을 만들고 있습니다. 로그인/인증 기능이 있어야합니다. 지금은 데이터베이스에 사용자 자격 증명과 별도로 사용자 정보를 저장합니다. 귀중한 암호를 전달하고 싶지 않기 때문에 내 사용자 모델에 자격 증명이 포함되어 있지 않습니다.봄과 줄무늬 보안 디자인

스프링은 모든 DAO를 관리합니다.

이제 비 컨테이너 기반 보안 시스템을 구현하고 있습니다. 암호의 sha-2 해시를 저장하고 양식에 제출 된 암호와 데이터베이스에 저장된 암호를 비교합니다. 이 비교는 테스트를 거쳐 작동합니다. 이걸 어떻게 연결하는지 알아 내려고 해요. 지금은 LoginActionBean이 로그인 요청을 포착하고 내부적으로 UserDAO를 사용하여 자격 증명을 검색하고 제출 된 매개 변수와 비교를 수행하는 "PasswordService"라는 싱글 톤을 사용합니다. 내 봄 콩은 다음과 같습니다

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

그러나 다음 PasswordService 싱글은 필요 : 정말 (UserDAO는 인터페이스) 싱글에서 이해가되지 않습니다

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

방법.

적절한 디자인을 찾고 있습니다. ServiceLocators가 Spring이 발명 된 바로 그 이유라고 읽었습니다. 이견있는 사람?

내가 어떻게 설계 할 수 있는지 알고 싶습니다. 나는 사용자가 "로그인"을 클릭 할 때 호출되는 ActionBean을 가지고 있지만 실제로 어떻게 인증합니까? 인증 서비스를 빈에 주입합니까? 누구나 호출 할 수있는 싱글 톤을 만들 수 있습니까? LoginAcionBean이 Spring이 주입하는 제네릭 인터페이스가 있습니까? 제가 봄을 사용하지 않았다면 어떻게 될까요?

답변

1
  1. userDao를 삽입하는 것이 의미가없는 이유를 알지 못합니다.

  2. xml이 factory-method = "getInstance"를 사용하는 이유를 모르겠습니다. 당신은 모든 인스턴스 물건과 싱글 톤 물건을 버릴 수 있습니다. 스프링은 패스워드 서비스 클래스의 인스턴스 하나를 인스턴스화하고 많은 클래스가 필요로하는 곳에 주입한다. 그리고 그들은 모두 같은 인스턴스를 가질 것이다. 그래서 봄이 당신을위한 싱글 톤을 창조하고 있습니다. 암호 서비스 클래스는 단순한 pojo가 될 수 있습니다. userDao 구현에서도 마찬가지입니다.

스프링 주석을보고, 이해하고, 사용하는 것이 좋습니다. 기본적으로 주입 될 클래스에 @Service를 사용하고 주입 된 클래스의 setter에서 @Autowired를 사용합니다. 또한 주석 구성 요소를 켜려면 XML 구성 파일에 무언가를 추가해야합니다.

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

빈 당신이, 당신이 할 필요가 없습니다 제어 클래스하지 않는 : 당신이 DAO에 대한 세터를하지 않으려면 위의 대답에 추가

+0

이 점에 대해 명확하게 알 수는 없지만 어떤 싱글 톤 작업을 수행 할 필요는 없습니다. 봄이 당신을 위해 모든 것을 해줍니다. 방금 봄 콩을 설정하면 모두 효과적으로 싱글 톤이됩니다. 비 싱글 톤 빈을 생성하려면 스프링을 얻으려면 추가 선회를해야합니다. – lumpynose

+0

그것이 맞다고 생각하지 않는 이유는 싱글 톤 클래스가 "setUserDAO"메소드를 가지고 있기 때문입니다. 이것은 서비스를 사용하는 사람이 설정할 수 있습니다. 즉 누군가 기술적으로 null을 지정할 수 있습니다. 누군가를 "인증"하는 올바른 방법이 OOD 관점에서 무엇인지 궁금합니다. – djunforgetable

+0

누구나 세터를 부를 수있는 문제에 대해 동의합니다. Gandalf의 생성자 응답은 내가 걱정할 때 사용합니다. 또한 setter를 비공개로 설정 한 다음 주석 (@Autowired)을 사용하면 스프링이 여전히 setter를 사용할 수 있습니다. 그것에 대해 긍정적이지 않습니다. 제 의견으로는 정말 대충 보입니다. – lumpynose

1

, 그냥 생성자 주입을 사용 그것은 싱글 톤, 스프링은 기본적으로 그렇게 할 것입니다.

나는 개인적으로 주석이 아닙니다.

0

내 솔루션은 "인증"방법으로 인터페이스를 갖추는 것이 었습니다. 그런 다음 UserDAO 객체를 사용하는 생성자를 사용하여 인터페이스를 구현하는 서비스 클래스를 만듭니다.이 방법으로, 서비스를 필요로하는 객체는 인스턴스화를 수행하지 않고 (봄에 끝났습니다) 수행되는 기본 구현 (LDAP, SSO, 간단한 비밀번호 비교 등)을 인식하지 못합니다. 작업을 완료 한 것으로 보입니다. P