Spring security-custom token filter
Ich versuche, führen Sie einen benutzerdefinierten filter zu bekommen ein token und zu validieren. Ich bin nach dem Ansatz in diesem Antwort.
Dies ist die relevante Konfiguration:
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;
}
}
Aber es ist wie die AuthenticationTokenFilter nicht zu der Kette Hinzugefügt. Debuggen kann ich sehen, dass wenn ich einen Anruf gelangt es zu den SecurityConfig und konfigurieren der Methode, aber nicht in den filter.
Was fehlt?
hast du irgendwelche andere security-config-Klassen ?
Halca Nein, fehlt etwas ?
es sieht aus wie es funktionieren sollte, hatte ich einige seltsame Verhaltensweisen wie deine, es wurde mit
beim ersten Anruf gelangt es zu der configure Methode(aber nur einmal, die nächste aufruft, gelangt direkt auf die Steuerung). Der filter wird ignoriert, ich weiß nicht, ob die HttpSecurity-Konfiguration korrekt ist
Wann wird TokenAuthenticationProviderr genannt werden? Sollte AuthenticationTokenFilter und TokenAuthenticationProviderr aufgerufen werden bei jeder Anfrage??
Halca Nein, fehlt etwas ?
es sieht aus wie es funktionieren sollte, hatte ich einige seltsame Verhaltensweisen wie deine, es wurde mit
@Order
- annotation-security-config-Klassenbeim ersten Anruf gelangt es zu der configure Methode(aber nur einmal, die nächste aufruft, gelangt direkt auf die Steuerung). Der filter wird ignoriert, ich weiß nicht, ob die HttpSecurity-Konfiguration korrekt ist
Wann wird TokenAuthenticationProviderr genannt werden? Sollte AuthenticationTokenFilter und TokenAuthenticationProviderr aufgerufen werden bei jeder Anfrage??
InformationsquelleAutor Federico | 2014-03-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
versuchen zu deaktivieren
anonymous
Authentifizierung und ändern zufully
- Authentifizierung, um Ihre Sicherheit Regel.etwas wie dieses :
Sie sollte mindestens "spring-security-javaconfig-1.0.0.M1.jar", was ist kompilieren fein
Ich habe spring-security-web-und spring-security-config, warum ist das lib notwendig?
das lib für java-config für spring security
Nein, es ist das gleiche
InformationsquelleAutor Eugen Halca
Was Ihnen fehlt, ist
in Ihrem web.xml oder gleichwertig für intializers auf Ihren Klassenpfad ein:
Dies ist unabhängig von Ihrer WebApplicationInitializer. Beachten Sie, dass:
Beispiel:
Zusammenfassen, aus der Feder Dokumentation:
Der Security-Filter-Kette
InformationsquelleAutor kedzi
Alte post, aber ich denke, authenticationProvider() kommen muss, BEVOR "addBeforeFilter". Nicht sicher, ob es heute einen Unterschied machen, aber es könnte wichtig sein. Es mag nicht wie viel.
Auch versuchen, fügen Sie diese auf Ihrem Konfigurations-Klasse um das Problem zu lösen:
InformationsquelleAutor Dexter