2017-02-21 1 views
3

J'essaie de créer un fichier JAR conditionnable indépendant avec une annotation personnalisée, qui à l'inclusion dans une fonction de mappage de contrôleur (et prenant userToken comme entrée dans l'en-tête) renvoie un booléen si l'utilisateur est authentifié ou maintenant.Créer une annotation personnalisée pour valider userToken à partir de l'en-tête

// Expected way of inclusion 
public @ResponseBody boolean isAuthenticated(@Authenticator(@RequestHeader("userToken")) Boolean isUserAuthenticated) { 
return isUserAuthenticated; 
} 

Je sais que ce ne sera pas la bonne syntaxe, puisque l'utilisation de ce code donne l'erreur que RequestMapping ne peut pas être converti en chaîne (et annotations accepter que des valeurs primitives).

Je suis également ouvert à d'autres approches, mais il devrait avoir la possibilité de renvoyer l'authentification booléenne uniquement lorsque cela est nécessaire et non via l'interception globale.

Important: Veuillez noter que @Authenticator provient d'un package indépendant importé dans le package actuel via Maven. HTTPServletRequest passerait-il dans ConstraintValidator.

+1

Je pense que vous vous essayez de réécrire Spring Security. –

+0

Veuillez indiquer quel module de sécurité Spring peut être réutilisé ici. De plus, je voulais un package léger donc je n'ai pas inclus trop de dépendances. –

+0

J'ai ajouté une réponse. –

Répondre

0

Utilisez la sécurité du printemps BasicAuthenticationFilter:

public class MyBasicAuthenticationFilter extends BasicAuthenticationFilter { 

    private AuthenticationManager authenticationManager; 

    public MyBasicAuthenticationFilter(AuthenticationManager authenticationManager) { 
     super(authenticationManager); 
     this.authenticationManager=authenticationManager; 
    } 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { 
     // do you checks here 
     super.doFilterInternal(request, response, chain); 
    } 
} 

Ensuite, ajoutez ceci à votre configuration de sécurité avec quelque chose comme:

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .authorizeRequests() 
       .antMatchers("/", "/home").permitAll() 
       .anyRequest().authenticated() 
       .and() 
       .formLogin() 
       .loginPage("/login") 
       .permitAll() 
       .and() 
       .logout() 
       .permitAll(); 

     http.addFilterBefore(new MyBasicAuthenticationFilter(authenticationManager()); 
    } 

    @Bean 
    public AuthenticationManager authenticationManager() { 
     return new MyAuthenticationManager(); 
    } 
+0

Merci pour l'aide, mais c'est ce dont j'ai besoin. Veuillez noter que mon paquet sera inclus dans d'autres projets et que Annotation devrait simplement accepter le userToken et le valider, et renvoyer une erreur s'il y a des problèmes. –