使用Dropwizard进行基于角色的访问控制

时间:2014-06-03 16:26:37

标签: java oauth dropwizard authentication rbac

我们为下一个项目加入了Dropwizard,我们需要实现的一个基于角色的访问控制机制。

使用Dropwizard或我可以遵循的示例是否有标准的简单方法?

2 个答案:

答案 0 :(得分:7)

你看过dropwizard-auth了吗?它可以很容易地插入你想要的任何身份验证方法(Shiro,Spring等)。如果你想走得那么远,它也支持OAuth2 ......

您可以像这样实施Shiro身份验证器:

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();
  }

}

你可以在这样的环境中注册Shiro(从run方法调用):

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"));
}

然后检查这样的角色:

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

答案 1 :(得分:1)

你可以很好地使用dropwizard提供的auth机制 http://www.dropwizard.io/0.9.1/docs/manual/auth.html

@RolesAllowed("ADMIN")
@GET
public SecretPlan getSecretPlan(@Auth User user) {
   return dao.findPlanForUser(user);
}