Función de control de acceso basado en el uso de Dropwizard
-
21-12-2019 - |
Pregunta
Estamos clavar Dropwizard para nuestro próximo proyecto y una de las cosas que vamos a implementar es un rol basado en mecanismo de control de acceso.
Hay un estándar manera fácil de hacerlo es usando Dropwizard o ejemplos puedo seguir?
Solución
Has echado un vistazo a dropwizard-auth?Esto hace que sea muy fácil de conectar en cualquier método de autenticación que desee (Shiro, Primavera, etc).También es compatible OAuth2 si quieres ir tan lejos...
Se puede implementar un 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();
}
}
Y usted puede registrarse Shiro con el medio ambiente como este (llamado desde su 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"));
}
Y, a continuación, comprobar para un papel como este:
@GET
public SecretPlan getSecretPlan(@Auth Subject subject) {
if (user.hasRole("secretPlanner")) {
return new SecretPlan();
} else {
return new NonSecretPlan();
}
}
Otros consejos
Puede usar Mecanismos de autenticación Dropwizard proporcionados http://www.dropwizard.io/0.9.1/docs/manual/auth.html
@RolesAllowed("ADMIN")
@GET
public SecretPlan getSecretPlan(@Auth User user) {
return dao.findPlanForUser(user);
}