Spring security token personnalisé filtre
Je suis en train de réaliser un filtre personnalisé pour obtenir un jeton et de les valider. Je suis en suivant l'approche adoptée dans ce réponse.
C'est la configuration par défaut:
SecurityConfig:
@Configuration
@EnableWebSecurity
@ComponentScan(basePackages = {"com.company.app"})
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Inject
AuthenticationTokenFilter authenticationTokenFilter;
@Inject
TokenAuthenticationProvider tokenAuthenticationProvider;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.addFilterBefore(authenticationTokenFilter, BasicAuthenticationFilter.class)
.antMatcher("/*")
.authenticationProvider(tokenAuthenticationProvider)
.authorizeRequests()
.anyRequest().authenticated();
}
}
AuthenticationTokenFilter:
@Component
public class AuthenticationTokenFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(AuthenticationTokenFilter.class);
@Override
public void init(FilterConfig fc) throws ServletException {
logger.info("Init AuthenticationTokenFilter");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws IOException, ServletException {
SecurityContext context = SecurityContextHolder.getContext();
if (context.getAuthentication() != null && context.getAuthentication().isAuthenticated()) {
//do nothing
} else {
Map<String,String[]> params = req.getParameterMap();
if (!params.isEmpty() && params.containsKey("auth_token")) {
String token = params.get("auth_token")[0];
if (token != null) {
Authentication auth = new TokenAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(auth);
}
}
}
fc.doFilter(req, res);
}
@Override
public void destroy() {
}
}
TokenAuthentication:
public class TokenAuthentication implements Authentication {
private String token;
public TokenAuthentication(String token) {
this.token = token;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return new ArrayList<GrantedAuthority>(0);
}
@Override
public Object getCredentials() {
return token;
}
@Override
public Object getDetails() {
return null;
}
@Override
public Object getPrincipal() {
return null;
}
@Override
public boolean isAuthenticated() {
return false;
}
@Override
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
}
@Override
public String getName() {
return null;
}
}
TokenAuthenticationProvider:
@Component
public class TokenAuthenticationProvider implements AuthenticationProvider {
private static final Logger logger = LoggerFactory.getLogger(TokenAuthenticationProvider.class);
@Override
public Authentication authenticate(Authentication auth) throws AuthenticationException {
if (auth.isAuthenticated())
return auth;
String token = auth.getCredentials().toString();
User user = userSvc.validateApiAuthenticationToken(token);
if (user != null) {
auth = new PreAuthenticatedAuthenticationToken(user, token);
auth.setAuthenticated(true);
logger.debug("Token authentication. Token: ");
} else
throw new BadCredentialsException("Invalid token " + token);
return auth;
}
@Override
public boolean supports(Class<?> aClass) {
return true;
}
}
Mais c'est comme le AuthenticationTokenFilter n'est pas ajouté à la chaîne. Débogage je peux voir que quand je fais un appel, il entre à l'SecurityConfig et configurer la méthode, mais de ne pas le filtre.
Ce qui est absent?
avez-vous de toute sécurité de l'autre config classes ?
Halca pas, est quelque chose qui manque ?
il semble comme il se doit le travail, j'ai eu quelques comportements étranges comme la votre, c'est avec
lors de la première convocation, il entre à la méthode configure(mais une seule fois, la prochaine appels entre directement à la manette). Le filtre est ignoré, je ne sais pas si le HttpSecurity configuration est correcte
quand TokenAuthenticationProviderr sera appelé? Devrait AuthenticationTokenFilter et TokenAuthenticationProviderr être appelé à chaque requête??
Halca pas, est quelque chose qui manque ?
il semble comme il se doit le travail, j'ai eu quelques comportements étranges comme la votre, c'est avec
@Order
annotation sur la sécurité config classeslors de la première convocation, il entre à la méthode configure(mais une seule fois, la prochaine appels entre directement à la manette). Le filtre est ignoré, je ne sais pas si le HttpSecurity configuration est correcte
quand TokenAuthenticationProviderr sera appelé? Devrait AuthenticationTokenFilter et TokenAuthenticationProviderr être appelé à chaque requête??
OriginalL'auteur Federico | 2014-03-12
Vous devez vous connecter pour publier un commentaire.
essayez de désactiver
anonymous
d'authentification et de changement defully
d'authentification pour la sécurité de votre règle.quelque chose comme ceci :
vous devez avoir au moins "spring-security-javaconfig-1.0.0.M1.jar" qui est la compilation de beaux
J'ai de printemps à la sécurité web et de printemps-sécurité-config, pourquoi est-ce que les lib-elle nécessaire?
cette lib est pour java config pour le printemps de sécurité
non, c'est la même chose
OriginalL'auteur Eugen Halca
Ce qui vous manque est
dans votre web.xml ou équivalent pour intializers sur votre classpath:
Ceci est distinct de votre WebApplicationInitializer. Note:
Exemple:
Pour résumer, à partir du Printemps de la documentation:
Le Filtre De Sécurité De La Chaîne
OriginalL'auteur kedzi
Vieux post, mais je pense que authenticationProvider() doit venir AVANT "addBeforeFilter". Vous ne savez pas si cela fera une différence d'aujourd'hui, mais il pourrait être important. Il ne peut pas autant d'importance.
Aussi essayer d'ajouter sur votre classe de configuration pour résoudre le problème:
OriginalL'auteur Dexter