SORU
24 Ocak 2011, PAZARTESİ


Yapılandırma Bahar Güvenlik 3.x birden çok giriş noktası var

Spring Security 3 kullanıyorum.x projeleri için kullanıcı kimlik doğrulama işlemek için, ve şu ana kadar kusursuz bir şekilde çalıştı.

Geçenlerde yeni bir proje için gereksinimleri aldı. Bu projede, kullanıcı kimlik doğrulaması 2 takım gerektirir: veritabanı LDAP ve Kimlik Doğrulaması müşteri için başka bir karşı çalışanların kimlik doğrulaması için. Bahar Güvenlik bu yapılandırma konusunda biraz tıkandım.

Benim ilk fikir aşağıdaki alanları olan bir oturum açma ekranı oluşturmak için:-

  • kullanıcıların, çalışanların veya müşterilerin olup olmadığını seçmek için bir radyo düğmesini saha.
  • 9 ** kullanım alanı.
  • j_password parola alanı.

Eğer kullanıcı "Bahar Güvenlik LDAP karşı, onları tasdik etmek istiyorum, aksi takdirde kimlik bilgileri veritabanı. karşı doğrulanır" çalışan seçerse Ancak, sorun /j_spring_security_check sunulacak şeklidir ve bana uygulanan özel kimlik doğrulama sağlayıcısı için radyo düğmesi alan göndermek için bir yol var. İlk aklıma gelen şey, muhtemelen 12 ** varsayılan güvenmek yerine iki form gönderme URL gerekir. Her bir URL farklı kimlik doğrulama sağlayıcıları tarafından ele alınacaktır, ama Bahar Güvenlik içinde yapılandırmak için nasıl emin değilim.

Biliyorum Bahar Güvenlik, elimden yapılandırma geri çekilin kimlik doğrulaması, örneğin LDAP kimlik doğrulaması başarısız olur, o zaman geri düşmek için veritabanı kimlik doğrulama, ama bu değil ne olduğumu çekim için bu yeni bir proje.

Biri Bahar Güvenlik 3 Bu yapılandırma nasıl hareket etmem gerektiğini paylaşabilirsiniz.x?

Teşekkür ederim.


- 01-28-2011 - @EasyAngel tekniği GÜNCELLEŞTİRİN

Şunları yapmaya çalışıyorum:-

  • Çalışan form giriş /j_spring_security_check_for_employee boyun eğmiştir
  • Müşteri form giriş 14* *gönderir

2 farklı form oturum açma sebebim bana kimlik doğrulama için farklı kullanıcıya göre işlemek, geri çekilmek kimlik doğrulaması yapmak yerine izin vermektir. Çalışan ve müşteri aynı kullanıcı KİMLİĞİ, benim durumumda olabilir.

@EasyAngel fikri ben dahil, ama bazı itiraz sınıfları değiştirmek zorunda. Şu anda karşı karşıyayım sorun URL Error 404: SRVE0190E: File not found: /j_spring_security_check_for_employee almaya devam ediyorum çünkü Bahar Güvenlik kayıtlı görünüyor ne filtre işlemleri. Benim hislerime springSecurityFilterChain fasulye düzgün kablolu, böylece benim özel filtreler hiç kullanılmaz.

Bu arada, Eclipse kullanıyorum ve com.ibm.ws.webcontainer.invokefilterscompatibility=true özellik sunucusu var. Sorun olmadan varsayılan /j_spring_security_check vurmak mümkün değilim.

İşte tam güvenlik yapılandırması:-

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:sec="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

    <sec:http auto-config="true">
        <sec:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1" default-target-url="/welcome.jsp"
            always-use-default-target="true" />
        <sec:logout logout-success-url="/login.jsp" />
        <sec:intercept-url pattern="/employee/**" access="ROLE_EMPLOYEE" />
        <sec:intercept-url pattern="/customer/**" access="ROLE_CUSTOMER" />
        <sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    </sec:http>

    <bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
        <sec:filter-chain-map path-type="ant">
            <sec:filter-chain pattern="/**" filters="authenticationProcessingFilterForEmployee, authenticationProcessingFilterForCustomer" />
        </sec:filter-chain-map>
    </bean>

    <bean id="authenticationProcessingFilterForEmployee" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        <property name="authenticationManager" ref="authenticationManagerForEmployee" />
        <property name="filterProcessesUrl" value="/j_spring_security_check_for_employee" />
    </bean>

    <bean id="authenticationProcessingFilterForCustomer" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        <property name="authenticationManager" ref="authenticationManagerForCustomer" />
        <property name="filterProcessesUrl" value="/j_spring_security_check_for_customer" />
    </bean>

    <bean id="authenticationManagerForEmployee" class="org.springframework.security.authentication.ProviderManager">
        <property name="providers">
            <list>
                <ref bean="employeeCustomAuthenticationProvider" />
            </list>
        </property>
    </bean>

    <bean id="authenticationManagerForCustomer" class="org.springframework.security.authentication.ProviderManager">
        <property name="providers">
            <list>
                <ref bean="customerCustomAuthenticationProvider" />
            </list>
        </property>
    </bean>

    <bean id="employeeCustomAuthenticationProvider" class="ss.EmployeeCustomAuthenticationProvider">
        <property name="userDetailsService">
            <bean class="ss.EmployeeUserDetailsService"/>
        </property>
    </bean>

    <bean id="customerCustomAuthenticationProvider" class="ss.CustomerCustomAuthenticationProvider">
        <property name="userDetailsService">
            <bean class="ss.CustomerUserDetailsService"/>
        </property>
    </bean>

    <sec:authentication-manager>
        <sec:authentication-provider ref="employeeCustomAuthenticationProvider" />
        <sec:authentication-provider ref="customerCustomAuthenticationProvider" />
    </sec:authentication-manager>

</beans>

Bu birkaç gün önceden çalışma almak için görünmüyor olabilir, çünkü burada bir ödül başladım... hayal kırıklığı kelimedir. Birisi sorun(lar) işaret edecek, ya da eğer beni bu (kod) işlemek için daha iyi ya da daha temiz bir yol gösterirsen umuyorum.

Spring Security 3 kullanıyorum.x.

Teşekkür ederim.


GÜNCELLEME 01-29-2011 - @Ritesh tekniği

Tamam, @Ritesh yaklaşım çok yakından çalışmak için bir şey almak istediğim için başardım. Kullanıcı, müşteri ya da çalışan olup olmadığını seçmek için izin veren radyo var. Bu yaklaşım oldukça iyi, bir sorun ile çalışıyor gibi görünüyor

  • Eğer çalışan doğru kimlik bilgileri ile oturum, izin verilir...BEKLENDİĞİ GİBİ ÇALIŞIYOR.
  • Eğer çalışanın yanlış kimlik bilgileri ile oturum, izin verilmez...BEKLENDİĞİ GİBİ ÇALIŞIYOR.
  • Eğer müşteri doğru kimlik bilgileri ile oturum, izin verilir...BEKLENDİĞİ GİBİ ÇALIŞIYOR.
  • Eğer müşteri yanlış kimlik bilgileri ile oturum açtığında, kimlik doğrulaması geri çalışan kimlik doğrulaması için... düşüyorİŞE YARAMIYOR. Bu müşteri kimlik doğrulaması ı seçin ve çalışan kimlik bilgisi yumruk, çok kullanıcı izin verir, çünkü risklidir ve bu istediğim bir şey değil.
    <sec:http auto-config="false" entry-point-ref="loginUrlAuthenticationEntryPoint">
        <sec:logout logout-success-url="/login.jsp"/>
        <sec:intercept-url pattern="/employee/**" access="ROLE_EMPLOYEE"/>
        <sec:intercept-url pattern="/customer/**" access="ROLE_CUSTOMER"/>
        <sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

        <sec:custom-filter position="FORM_LOGIN_FILTER" ref="myAuthenticationFilter"/>
    </sec:http>


    <bean id="myAuthenticationFilter" class="ss.MyAuthenticationFilter">
        <property name="authenticationManager" ref="authenticationManager"/>
        <property name="authenticationFailureHandler" ref="failureHandler"/>
        <property name="authenticationSuccessHandler" ref="successHandler"/>
    </bean>

    <bean id="loginUrlAuthenticationEntryPoint"
          class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
        <property name="loginFormUrl" value="/login.jsp"/>
    </bean>

    <bean id="successHandler"
          class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
        <property name="defaultTargetUrl" value="/welcome.jsp"/>
        <property name="alwaysUseDefaultTargetUrl" value="true"/>
    </bean>

    <bean id="failureHandler"
          class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
        <property name="defaultFailureUrl" value="/login.jsp?login_error=1"/>
    </bean>


    <bean id="employeeCustomAuthenticationProvider" class="ss.EmployeeCustomAuthenticationProvider">
        <property name="userDetailsService">
            <bean class="ss.EmployeeUserDetailsService"/>
        </property>
    </bean>

    <bean id="customerCustomAuthenticationProvider" class="ss.CustomerCustomAuthenticationProvider">
        <property name="userDetailsService">
            <bean class="ss.CustomerUserDetailsService"/>
        </property>
    </bean>


    <sec:authentication-manager alias="authenticationManager">
        <sec:authentication-provider ref="customerCustomAuthenticationProvider"/>
        <sec:authentication-provider ref="employeeCustomAuthenticationProvider"/>
    </sec:authentication-manager>
</beans>

İşte güncelleştirilmiş benim yapılandırma. Yapmam gereken çok küçük bazı tweak için kimlik doğrulama geri düşme önlemek için vardır ama şimdi karar veremiyorum.

Teşekkür ederim.

UPDATE - ÇÖZÜM @Ritesh tekniği

Tamam, sorunu çözdüm sanırım. EmployeeCustomAuthenticationProvider varsayılan güvenmek yerine UsernamePasswordAuthenticationToken CustomerCustomAuthenticationProvider CustomerUsernamePasswordAuthenticationToken yarattığım gibi EmployeeUsernamePasswordAuthenticationToken yarattı. Bu sağlayıcılar supports():- . geçersiz kılar

CustomerCustomAuthenticationProvider sınıf

@Override
public boolean supports(Class<? extends Object> authentication) {
    return (CustomerUsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));
}

EmployeeCustomAuthenticationProvider sınıf

@Override
public boolean supports(Class<? extends Object> authentication) {
    return (EmployeeUsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));
}

MyAuthenticationFilter sınıf

public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {

    ...

    UsernamePasswordAuthenticationToken authRequest = null;

    if ("customer".equals(request.getParameter("radioAuthenticationType"))) {
        authRequest = new CustomerUsernamePasswordAuthenticationToken(username, password);

    }
    else {
        authRequest = new EmployeeUsernamePasswordAuthenticationToken(username, password);
    }

    setDetails(request, authRequest);

    return super.getAuthenticationManager().authenticate(authRequest);
}

... ve WALAA! Tamamen hayal kırıklığı, birkaç gün sonra artık çalışıyor!

Umarım, bu yazı Burada benimle aynı şeyi yapan birine yardım etmek mümkün olacak.

CEVAP
29 Ocak 2011, CUMARTESİ


/j_spring_security_check_for_employee * filterProcessingUrl*31 oluşturmak gerek yok.

Varsayılan bir iyi radyo düğmesi alan fikri ile çalışacak.

Özel Giriş LoginFilter çalışan ve müşteri için farklı simgeleri oluşturmak gerekir.

İşte adımlar:

  1. Çalışan girişi için varsayılan UsernamePasswordAuthenticationToken kullanın.

  2. Müşteri girişi için CustomerAuthenticationToken oluşturun. Sınıf tipi UsernamePasswordAuthenticationToken farklıdır AbstractAuthenticationToken uzatmak.

  3. Bir özel filtre giriş tanımlayın:

    <security:http>
        <security:custom-filter position="FORM_LOGIN_FILTER" ref="customFormLoginFilter" />
    </security:http>
    
  4. customFormLoginFilter, attemptAuthentication override izler (sahte kod):

    if (radiobutton_param value employee) {
        UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
        setDetails(whatever);
        return getAuthenticationManager().authenticate(authRequest);
    } else if (radiobutton_param value customer) {
        CustomerAuthenticationToken authRequest = new CustomerAuthenticationToken(username, password);
        setDetails(whatever);
        return getAuthenticationManager().authenticate(authRequest);
    }
    
  5. EmployeeCustomAuthenticationProvider 42 *yöntem* 44 *destek için geçersiz kılar.

  6. CustomerCustomAuthenticationProvider 45 *yöntem* 47 *destek için geçersiz kılar.

    @Override
    public boolean supports(Class<?> authentication) {
        return (CustomerAuthenticationToken.class.isAssignableFrom(authentication));
    }
    
  7. authentication-manager: her iki sağlayıcı kullanın

    <security:authentication-manager alias="authenticationManager">
        <security:authentication-provider ref='employeeCustomAuthenticationProvider ' />
        <security:authentication-provider ref='customerCustomAuthenticationProvider ' />
    </security:authentication-manager>
    

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DRDAnimation

    DRDAnimation

    28 EYLÜL 2012
  • Kat Krazy

    Kat Krazy

    12 Kasım 2010
  • My Name Is Jeff

    My Name Is J

    26 ŞUBAT 2008