Comment faire l'authentification de base d'une ressource dans Dropwizard
Je crois que j'ai l'authentification de base de travail mais je ne suis pas sûr de la façon de protéger les ressources de sorte qu'ils ne peuvent être accessibles lorsque l'utilisateur s'est connecté.
public class SimpleAuthenticator implements Authenticator<BasicCredentials, User> {
UserDAO userDao;
public SimpleAuthenticator(UserDAO userDao) {this.userDao = userDao;}
@Override
public Optional<User> authenticate(BasicCredentials credentials) throws AuthenticationException
{
User user = this.userDao.getUserByName(credentials.getUsername());
if (user!=null &&
user.getName().equalsIgnoreCase(credentials.getUsername()) &&
BCrypt.checkpw(credentials.getPassword(), user.getPwhash())) {
return Optional.of(new User(credentials.getUsername()));
}
return Optional.absent();
}
}
Mon Signin ressource est comme ceci:
@Path("/myapp")
@Produces(MediaType.APPLICATION_JSON)
public class UserResource {
@GET
@Path("/signin")
public User signin(@Auth User user) {
return user;
}
}
Et je signe:
~/java/myservice $ curl -u "someuser" http://localhost:8080/myapp/signin
Enter host password for user 'someuser':
{"name":"someuser"}
Question
Disons que l'utilisateur se connecte à partir d'un navigateur ou d'une application mobile native extrémité avant à l'aide de la /myapp/signin
point de terminaison. Alors, comment puis-je protéger un autre point de terminaison, disons, /myapp/{username}/getstuff
qui oblige l'utilisateur à être signedin
@GET
@Path("/myapp/{username}/getstuff")
public Stuff getStuff(@PathParam("username") String username) {
//some logic here
return new Stuff();
}
source d'informationauteur birdy
Vous devez vous connecter pour publier un commentaire.
Il y a 2 choses lorsque vous essayez de mettre en œuvre de REPOS. L'un est celui de l'Authentification (qui semble que vous avez eu de travail) et l'autre est d'Autorisation (qui est ce que je crois que votre question est).
La façon dont j'ai traité dans dropwizard avant est, avec à chaque utilisateur de compte, de vous renvoyer à une sorte de access_token (ce qui prouve qu'ils authentifié) vers le client, qui doit être renvoyé par eux dans CHAQUE appel successif qu'ils font partie de certains de l'en-tête (normalement c'est fait au travers de "l'Autorisation" de l'en-tête). Sur le côté serveur, vous devrez l'enregistrer/carte ce access_token pour QUE l'utilisateur avant de le retourner au client et lors de tous les appels successifs sont réalisés avec qui access_token, vous recherchez l'utilisateur associé avec qui access_token et de déterminer si l'utilisateur est autorisé à accéder à cette ressource ou pas. Maintenant un exemple:
1) l'Utilisateur se connecte avec /myapp/signin
2) Vous authentifier l'utilisateur et envoyer un access_token comme une réponse, tout en économisant de même de votre côté, comme, access_token --> userIdABCD
3) que Le client revienne à /myapp/{username}/getstuff. Si le client n'a pas fourni les "Autorisation" de l'en-tête avec l'access_token vous leur avez donné, vous devez retourner 401 Unauthorized code d'emblée.
4) Si le client fournit à l'access_token, vous pouvez rechercher l'utilisateur sur la base que access_token vous avez enregistré à l'étape # 2 et de vérifier si ce nom d'utilisateur a accès à cette ressource de pas. Si cela ne fonctionne pas, retour 401 code non autorisé, et si elle dispose de l'accès, le retour au réel des données en retour.
Maintenant venir ot de l'Autorisation d'en-tête de la partie. Vous avez accès à des "Authoroziation" tête dans tous vos appels à l'aide de la "@Contexte HttpServletRequest hsr" paramètre mais est-il judicieux d'ajouter ce paramètre à chaque appel? Non, il n'est pas. C'est là que les Filtres de Sécurité de l'aide dans dropwizard. Voici un exemple de la façon d'ajouter un filtre de sécurité.
Maintenant, les ressources qui ne ce filtre de sécurité protège vraiment? Pour cela, vous devrez ajouter ce filtre pour les ressources spécifiques que vous souhaitez protéger ce qui peut être fait comme suit:
Rappeler, ici, que votre url /myapp/signin et /myapp/{username}/getstuff, les deux passeront par ce filtre de sécurité, MAIS, /myapp/signin n'aura PAS un access_token, évidemment, parce que vous n'avez pas donné à tout pour le client. Que wil doivent être prises en charge dans le filtre lui-même comme:
L'url que vous êtes la protection dépendra de la manière dont vos url sont structurés et ce que vous souhaitez protéger. Le mieux url de la conception de, le plus il sera facile d'écrire des filtres de sécurité pour assurer leur protection, Avec l'ajout de ce filtre de sécurité le flux sera comme ceci:
1) l'Utilisateur va à /myapp/signin. L'appel sera de passer à travers le filtre et à cause de cette instruction "if", il continuera à votre RÉELLE des ressources de /myapp/signin et vous attribuera un access_token basée sur la réussite de l'authentification
2) l'Utilisateur effectue un appel à /myapp/{username}/mystuff avec l'access_token. Cet appel sera de passer à travers le même filtre de sécurité et passera par l'instruction "else" où vous pouvez faire votre autorisation. Si l'autorisation, l'appel sera de continuer à vous de la ressource réelle gestionnaire, et si n'est pas autorisée, 401 doit être retourné.
J'espère que cela aide! M'a pris environ 2 jours pour comprendre cela moi-même!
Désolé d'être un simple utilisateur . Je crois que vous pouvez protéger la ressource à l'aide d'un @Auth User