Função de controle de acesso baseado em usando Dropwizard
-
21-12-2019 - |
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?
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);
}