2011-07-05 26 views
5

Yay güvenliği kullanan bir uygulamam var. Kayıt işlemimde, HASHED parolasıyla yeni bir kullanıcı varlığı devam ediyor, kullanıcıya bir etkinleştirme belirteci içeren bir e-posta gönderiliyor. Bu simgeye tıklandığında kullanıcıyı, kullanıcı tarafından belirteç tarafından görünen, kullanıcıyı etkinleştiren ve uygulamaya yönlendiren bir UserActivationServlet'e yönlendirir. Ben otomatik olarak uygulamaya kullanıcıyı giriş yapmak istiyorum ve burada buYaylı güvenlik ile otomatik giriş

private void authenticateUserAndSetSession(HttpServletRequest request, User u) { 
    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
      u.getUsername(), u.getPassword()); //PROBLEM: THIS PASSWORD IS HASHED 

    // generate session if one doesn't exist 
    request.getSession(); 

    token.setDetails(new WebAuthenticationDetails(request)); 
    Authentication authenticatedUser = authenticationManager.authenticate(token); 

    SecurityContextHolder.getContext().setAuthentication(authenticatedUser); 
    request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, 
      SecurityContextHolder.getContext()); 
} 

sorunu yapmak benim servlet'dir bu yöntemi oluşturulduğu zaman Kullanıcı varlık üzerinde şifre alanı karma edildiğini olmasıdır dahil ettik. Bu yüzden düşünebildiğim diğer bir seçenek de ihmal edilen parolayı servelet (isteksiz!) Için bir istek parametresi olarak iletmektir.

Bir şeyi özledim mi, kullanıcının kimliğini doğrulamanın başka bir yolu var mı?

Teşekkür SOA size yardımcı olabilir ben doğru anlamak

+1

, kullanıcı aktivasyon linke tıklandığında ve biz baktık: etmek şöyle sadece yaratman yüzden authenticationManager ile Token oluştururken kimlik bilgilerini kullanmaya gerek onu yeniden kimlik doğrulaması Onu çok açık bir şekilde geçerli bir kullanıcı var, yani yok kimlik doğrulamaManager'la yeniden kimlik doğrulaması yapmalı ve böylece Token'i oluştururken kimlik bilgilerini kullanmaya gerek yok, sadece aşağıdaki gibi oluşturun: PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken ( p, null, p.getAuthorities()); –

+0

başka benzer bir soru (ve cevap) burada bulabilirsiniz: http://stackoverflow.com/a/12057327/26510 –

+1

@ClintonBosch Yorum yazabilirsin Cevap olarak kabul et ve onu kabul et – fglez

cevap

3

kullanıcı aktivasyon linke tıklandığında ve biz geçerli bir kullanıcı var onu çok net bakmis, bu yüzden gerek yoktur burada aptal ediliyordu

PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken(p, null, p.getAuthorities()); 
0

.

Oturum açma sayfasına yönlendirme yapmanız gerekmez, bunun yerine kullanıcının oturum açtığı hizmeti çağırmanız gerekir. Denetleyicide (veya hizmet katmanının üzerinde bir yerde) bulunan oturum açma ile ilgili mantıkların "aşağı taşınması" gerekir. 've senin servlet tarafından kullanılır. Sonra da servlet'dir gelen loginService.login(username); çağırabilir

public interface LoginService { 
    // this will be called from the login page 
    public void login(String username, String hashedPass); 

    // this will only be visible to other services 
    // you can secure it with AOP and Spring security's method security 
    public void login(String username); 
} 

:

hizmet gibi bir şey olabilir.

Veya tam durumunda

şifre olmadan jetonunuzu pass:

loginService.login(new UsernamePasswordAuthenticationToken(u.getUsername(), "")); 
+0

Neden olumsuz puan? – Simeon

İlgili konular