2015-09-19 31 views
6

ben veritabanı kullanıcı (UserDAO) karşı kimlik bilgilerini kontrol etmek istiyorum Dropwizard Authentication 0.9.0-SNAPSHOTDropwizard: Temel Kimlik

kullanma.

aşağıdaki istisna

olsun! org.hibernate.HibernateException: Hiçbir oturum şu an nasıl Authenticator'a oturumu bağlamak yürütme içeriği

bağlı? Veya veritabanı kullanıcısına karşı daha iyi kontrol yöntemleri var mı?

Kimlik Kanıtlayıcı Sınıf

package com.example.helloworld.auth; 

import com.example.helloworld.core.User; 
import com.example.helloworld.db.UserDAO; 
import com.google.common.base.Optional; 
import io.dropwizard.auth.AuthenticationException; 
import io.dropwizard.auth.Authenticator; 
import io.dropwizard.auth.basic.BasicCredentials; 

public class ExampleAuthenticator implements Authenticator<BasicCredentials, User> { 
    UserDAO userDAO; 

    public ExampleAuthenticator(UserDAO userDAO) { 
     this.userDAO = userDAO; 
    } 

    @Override 
    public Optional<User> authenticate(BasicCredentials credentials) throws AuthenticationException { 
     Optional<User> user; 

     user = (Optional<User>) this.userDAO.findByEmail(credentials.getUsername()); 


     if ("secret".equals(credentials.getPassword())) { 
      return Optional.of(new User(credentials.getUsername())); 
     } 
     return Optional.absent(); 
    } 
} 

Uygulama Sınıfı

@Override 
public void run(HelloWorldConfiguration configuration, Environment environment) throws Exception { 
    final UserDAO userDAO = new UserDAO(hibernate.getSessionFactory()); 

    environment.jersey().register(new AuthDynamicFeature(
     new BasicCredentialAuthFilter.Builder<User>() 
       .setAuthenticator(new ExampleAuthenticator(userDAO)) 
       .setAuthorizer(new ExampleAuthorizer()) 
       .setRealm("SUPER SECRET STUFF") 
       .buildAuthFilter())); 
    environment.jersey().register(RolesAllowedDynamicFeature.class); 
    //If you want to use @Auth to inject a custom Principal type into your resource 
    environment.jersey().register(new AuthValueFactoryProvider.Binder(User.class)); 

    environment.jersey().register(new UserResource(userDAO)); 
+0

unutmayın bu soru 0.9.0- rc ifade ettiğini rc4. –

+0

0.9.1.Final – harshil

cevap

5

için çalışır. Örnek olarak bu belirli changeset'a başvurabilirsiniz.

Bağımlılığı dahil edin.

Yetkilendirme ile ilgili diğer şeyleri kaydedin.

private void registerAuthRelated(Environment environment) { 
    UnauthorizedHandler unauthorizedHandler = new UnAuthorizedResourceHandler(); 
    AuthFilter basicAuthFilter = new BasicCredentialAuthFilter.Builder<User>() 
     .setAuthenticator(new BasicAuthenticator()) 
     .setAuthorizer(new UserAuthorizer()) 
     .setRealm("shire") 
     .setUnauthorizedHandler(unauthorizedHandler) 
     .setPrefix("Basic") 
     .buildAuthFilter(); 

    environment.jersey().register(new AuthDynamicFeature(basicAuthFilter)); 
    environment.jersey().register(RolesAllowedDynamicFeature.class); 
    environment.jersey().register(new AuthValueFactoryProvider.Binder(User.class)); 

    environment.jersey().register(unauthorizedHandler); 

} 

public class BasicAuthenticator<C, P> implements Authenticator<BasicCredentials, User> { 
    @Override 
    public Optional<User> authenticate(BasicCredentials credentials) throws AuthenticationException { 
     //do no authentication yet. Let all users through 
     return Optional.fromNullable(new User(credentials.getUsername(), credentials.getPassword())); 
    } 
} 

UnAuthorizedHandler

public class UnAuthorizedResourceHandler implements UnauthorizedHandler { 

    @Context 
    private HttpServletRequest request; 

    @Override 
    public Response buildResponse(String prefix, String realm) { 
     Response.Status unauthorized = Response.Status.UNAUTHORIZED; 
     return Response.status(unauthorized).type(MediaType.APPLICATION_JSON_TYPE).entity("Can't touch this...").build(); 
    } 

    @Context 
    public void setRequest(HttpServletRequest request) { 
     this.request = request; 
    } 
} 

Authorizer

public class UserAuthorizer<P> implements Authorizer<User>{ 
    /** 
    * Decides if access is granted for the given principal in the given role. 
    * 
    * @param principal a {@link Principal} object, representing a user 
    * @param role  a user role 
    * @return {@code true}, if the access is granted, {@code false otherwise} 
    */ 
    @Override 
    public boolean authorize(User principal, String role) { 
     return true; 
    } 
} 

Nihayet kaynak kullanmak temel authenticator

aşağıda gösterildiği gibi ileriye 0.9 başlayarak son sürümlerinde
@GET 
public Response hello(@Auth User user){ 
    return Response.ok().entity("You got permission!").build(); 
} 
3

Sen O zaman bu

environment.jersey().register(AuthFactory.binder(new BasicAuthFactory<>( new ExampleAuthenticator(userDAO), "AUTHENTICATION", User.class)));

benzeyen Application sınıfında kodu ihtiyacımız olacak sen @Auth t kullanabilir Bir yöntem için bir User parametresindeki ag ve herhangi bir gelen kimlik doğrulama bilgisiyöntemine isabet eder ve doğru User nesnesini veya absent kimlik bilgilerini veritabanınızda değilse geri dönmenize izin verir.

DÜZENLEME: aşağıdakileri ihtiyaç 0.9+ ile çalışmak için kimlik doğrulama almak için Dropwizard v0.8.4

+0

ile aynı sorunu vurmak Teşekkürler Rohan, ancak bu Dropwizard 0.9.0-rc4 ile çalışmıyor. –

+0

@DanielOzean Ah, anlıyorum. Bu en son resmi sürüm olan Dropwizard 0.8.4 üzerinde çalışmalıdır. Resmi olarak yayınlanana kadar 0.9.0 ile geliştirmek istemeyebilirsiniz. – Rohan

+0

@Siz haklısınız. Bunu çözüldüğü gibi işaretleyeceğim. –

1

, sen kaynak sınıfı yöntemlerinde "@Context" ek açıklama kullanabilirsiniz:

@RolesAllowed("EMPLOYEE") 
    @Path("/emp") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getEmployeeResponse(@Context SecurityContext context) { 
     SimplePrincipal sp = (SimplePrincipal) context.getUserPrincipal(); 
     return Response.ok("{\"Hello\": \"Mr. " + sp.getUsername() + "\"(Valuable emp)}").build(); 

    } 
İlgili konular