SORU
31 Mayıs 2012, PERŞEMBE


Bahar ile dinlendirici kimlik Doğrulama

Sorun:
Hassas bilgileri içeren bir Spring MVC tabanlı Dinlendirici bir API var. API her istek arzu değil, ancak kullanıcının kimlik bilgilerini gönderme güvenli (user/pass combo) olmalıdır. DİNLENME yönergelere göre (iç ve iş gereksinimleri), sunucu vatansız kalması gerekir. API gerçekleştirdik tarzı bir yaklaşım, başka bir sunucu tarafından tüketilen olacak.

Gereksinimler:

  • İstemci sunucu gelecekteki isteklerini doğrulamak için yeterli bilgi içerir ve vatansız kalır kimlik bilgileri ile .../authenticate için bir istek (korumasız URL); sunucu döndürür güvenli bir belirteç yapar. Bu büyük olasılıkla Bahar Güvenlik Remember-Me Token gibi aynı bilgileri içerir.

  • İstemci (korumalı) çeşitli linkler sonraki istekleri, sorgu parametresi (ya da, daha az arzu edilir, HTTP isteği başlık) olarak, daha önce elde edilen belirteç ekleme yapar.

  • İstemci tanımlama bilgileri saklamak için beklenemez.

  • Bahar zaten kullanıyoruz bu yana, çözüm Bahar Güvenliğini kullanmak gerekir.

Duvarın bu işi yapmaya karşı başımızı beceriyor oldum, umarım orada birileri zaten bu sorunu çözmüştür.

Yukarıdaki senaryo göz önüne alındığında, nasıl bu özel ihtiyaç çözebilir misin?

CEVAP
2 HAZİRAN 2012, CUMARTESİ


Bu operasyonu anlatıldığı gibi tam olarak çalıştırmayı başardık ve umarım başka biri çözüm. Yaptığımız şey şu:

Yani: güvenlik bağlamı ayarlayın

<security:http realm="Protected API" use-expressions="true" auto-config="false" create-session="stateless" entry-point-ref="CustomAuthenticationEntryPoint">
    <security:custom-filter ref="authenticationTokenProcessingFilter" position="FORM_LOGIN_FILTER" />
    <security:intercept-url pattern="/authenticate" access="permitAll"/>
    <security:intercept-url pattern="/**" access="isAuthenticated()" />
</security:http>

<bean id="CustomAuthenticationEntryPoint"
    class="com.demo.api.support.spring.CustomAuthenticationEntryPoint" />

<bean id="authenticationTokenProcessingFilter"
    class="com.demo.api.support.spring.AuthenticationTokenProcessingFilter" >
    <constructor-arg ref="authenticationManager" />
</bean>

Gördüğünüz gibi, bir özel yarattık sadece bir istek bizim tarafından filtre zinciri doğrulanmış olmasa 401 Unauthorized AuthenticationTokenProcessingFilter temelde döndüren AuthenticationEntryPoint,.

CustomAuthenticationEntryPoint:

public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
            AuthenticationException authException) throws IOException, ServletException {
        response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized: Authentication token was either missing or invalid." );
    }
}

AuthenticationTokenProcessingFilter:

public class AuthenticationTokenProcessingFilter extends GenericFilterBean {

    @Autowired UserService userService;
    @Autowired TokenUtils tokenUtils;
    AuthenticationManager authManager;

    public AuthenticationTokenProcessingFilter(AuthenticationManager authManager) {
        this.authManager = authManager;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        @SuppressWarnings("unchecked")
        Map<String, String[]> parms = request.getParameterMap();

        if(parms.containsKey("token")) {
            String token = parms.get("token")[0]; // grab the first "token" parameter

            // validate the token
            if (tokenUtils.validate(token)) {
                // determine the user based on the (already validated) token
                UserDetails userDetails = tokenUtils.getUserFromToken(token);
                // build an Authentication object with the user's info
                UsernamePasswordAuthenticationToken authentication = 
                        new UsernamePasswordAuthenticationToken(userDetails.getUsername(), userDetails.getPassword());
                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails((HttpServletRequest) request));
                // set the authentication into the SecurityContext
                SecurityContextHolder.getContext().setAuthentication(authManager.authenticate(authentication));         
            }
        }
        // continue thru the filter chain
        chain.doFilter(request, response);
    }
}

Belli ki,TokenUtils(ve davaya özgü çok) bazı özel kod ve kolayca paylaşılabilir mi içerir. İşte onun arayüzü:

public interface TokenUtils {
    String getToken(UserDetails userDetails);
    String getToken(UserDetails userDetails, Long expiration);
    boolean validate(String token);
    UserDetails getUserFromToken(String token);
}

İyi bir başlangıç için seni almak lazım. Mutlu kodlama. :)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kamaniusilelis

    kamaniusilel

    10 HAZİRAN 2011
  • Michael Zhang

    Michael Zhan

    8 EYLÜL 2012
  • Thehalopianoplayer

    Thehalopiano

    4 ŞUBAT 2011