Pergunta

Nós estamos adicionando Dropwizard para o nosso próximo projeto, e uma das coisas que vamos precisar para implementar uma função de controle de acesso baseado em mecanismo.

Existe um padrão maneira fácil de fazer isso usando Dropwizard ou exemplos que eu possa seguir?

Foi útil?

Solução

Você já tomou uma olhada dropwizard-auth?Torna-se muito fácil de usar em qualquer que seja o método de autenticação que você deseja (Shiro, Primavera, etc).Ele também suporta OAuth2 se você quiser ir tão longe...

Você pode implementar uma Shiro autenticador como este:

public class BasicAuthenticator implements Authenticator<BasicCredentials, Subject> {

  @Override
  public Optional<Subject> authenticate(BasicCredentials credentials) throws AuthenticationException {
    Subject subject = SecurityUtils.getSubject();
    try {
      subject.login(new UsernamePasswordToken(credentials.getUsername(), credentials.getPassword(), false));
      return Optional.of(subject);
    } catch (UnknownAccountException | IncorrectCredentialsException | LockedAccountException e) {
    } catch (AuthenticationException ae) {
    }
    return Optional.absent();
  }

}

E você pode se registrar Shiro com o ambiente como este (chamado a partir de sua run método):

void configureAuthentication(Environment environment) {
  JdbcRealm realm = getJdbcRealm(); // However your Shiro realm is configured

  DefaultSecurityManager securityManager = new DefaultSecurityManager(realm);
  SecurityUtils.setSecurityManager(securityManager);

  environment.jersey().register(new BasicAuthProvider<Subject>(new BasicAuthenticator(), "Shiro"));
}

E, em seguida, verifique para uma função como esta:

@GET
public SecretPlan getSecretPlan(@Auth Subject subject) {
  if (user.hasRole("secretPlanner")) {
    return new SecretPlan();
  } else {
    return new NonSecretPlan();
  }
}

Outras dicas

Você pode muito bem usar dropwizard fornecidos mecanismos de autenticação http://www.dropwizard.io/0.9.1/docs/manual/auth.html

@RolesAllowed("ADMIN")
@GET
public SecretPlan getSecretPlan(@Auth User user) {
   return dao.findPlanForUser(user);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top