Ich habe ziemlich viel Zeit damit verbracht, meinen Kopf mit der Spring-Sicherheit zu verbinden, wenn ich die reine Java-Konfiguration verwende. Es gibt ein paar Schritte, um dies zum Laufen zu bringen. Es sollte etwas in dieser Richtung sein. Der grundlegende Prozess ist wie folgt:
Erstellen von benutzerdefinierten Filtern Anforderungen für bestimmte Berechtigungsinformationen überprüfen
Jeder Filter gibt null zurück (wenn keine Genehmigung dieser Art gefunden wird) oder eine benutzerdefinierte AbstractAuthenticationToken
wenn ein Filter ein Token zurückgibt, jeder Träger des AuthenticationProvider (Klassen-) Methode wird mit dem Token gibt true zurück, aufgerufen werden | false, wenn es die Authentifizierung versuchen sollte
assaultAuthentication wird dann für den AuthenticationProvider aufgerufen, der das Token unterstützt. Hier führen Sie Serviceanfragen durch, um den Benutzer zu authentifizieren. Sie können dann LoginException's auslösen oder authentication.setAuthenticated (true) aufrufen und das Token für eine erfolgreiche Authentifizierung zurückgeben.
Ich habe mit diesem Setup für eine Weile verschiedene Authentifizierungsmethoden unterstützt (schriebenen Antrag, Benutzername/Passwort, oauth etc) und es funktioniert ganz gut.
Sie können AuthenticationSuccessHandler und AuthenticationFailuersHandler auch an die benutzerdefinierten Sicherheitsfilter übergeben, um benutzerdefinierte Umleitungsstrategien und Fehlerbehandlung bereitzustellen.
Stellen Sie außerdem sicher, dass die Ant-Matcher in den Konstruktoren des Filters eingerichtet sind, um zu steuern, welche URL-Muster die Filter ebenfalls anwenden. Zum Beispiel würde ein LDAP-Anfrage-Filter wahrscheinlich mit jeder Anfrage "/ *" überprüft werden müssen, während ein Benutzername/Passwort-Filter nur auf POSTs zu/Login oder ähnlichem überprüft werden kann.
Beispielcode: Erstellen
1) individuelle AuthenticationToken die für jede Art der Authentifizierung Sie
public class LDAPAuthorizationToken extends AbstractAuthenticationToken {
private String token;
public LDAPAuthorizationToken(String token) {
super(null);
this.token = token;
}
public Object getCredentials() {
return token;
}
public Object getPrincipal() {
return null;
}
}
public class OTPAuthorizationToken extends UsernamePasswordAuthenticationToken {
private String otp;
public OTPAuthorizationToken(String username, String password, String otp) {
super(username, password);
this.otp = otp;
}
public String getOTP() {
return otp;
}
}
2) Erstellen von benutzerdefinierten Sicherheitsfilter für jeden Typ
public class LDAPAuthorizationFilter extends AbstractAuthenticationProcessingFilter {
@Autowired
private UserDetailsService userDetailsService;
public LDAPAuthorizationFilter() {
super("/*"); // allow any request to contain an authorization header
}
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException
{
if (request.getHeader("Authorization") == null) {
return null; // no header found, continue on to other security filters
}
// return a new authentication token to be processed by the authentication provider
return new LDAPAuthorizationToken(request.getHeader("Authorization"));
}
}
public class OTPAuthorizationFilter extends AbstractAuthenticationProcessingFilter {
@Autowired
private UserDetailsService userDetailsService;
public OTPAuthorizationFilter() {
super("/otp_login");
}
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException
{
if (request.getParameter("username") == null || request.getParameter("password") == null || request.getParameter("otp") == null) {
return null;
}
// return a new authentication token to be processed by the authentication provider
return new OTPAuthorizationToken(request.getParameter("username"), request.getParameter("password"), request.getParameter("otp"));
}
}
unterstützen möchten 3) Erstellen Sie benutzerdefinierte Authentifizierungsprovider
public class LDAPAuthenticationProvider implements AuthenticationProvider {
@Autowired
private MyAuthenticationService sampleService;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
LDAPAuthorizationToken auth = (LDAPAuthorizationToken)authentication;
String username = sampleService.verifyToken(auth.getCredentials());
if (username == null) {
throw new LoginException("Invalid Token");
}
auth.setAuthenticated(true);
return auth;
}
@Override
public boolean supports(Class<?> authentication) {
if (authentication.isAssignableFrom(LDAPAuthorizationToken.class)) {
return true;
}
return false;
}
}
public class OTPAuthenticationProvider implements AuthenticationProvider {
@Autowired
private MyAuthenticationService sampleService;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
OTPAuthorizationToken auth = (OTPAuthorizationToken)authentication;
String error = sampleService.loginWithOTP(auth.getPrincipal(), auth.getCredentials(), auth.getOTP());
if (error != null) {
throw new LoginException(error);
}
auth.setAuthenticated(true);
return auth;
}
@Override
public boolean supports(Class<?> authentication) {
if (authentication.isAssignableFrom(OTPAuthorizationToken.class)) {
return true;
}
return false;
}
}
4) Konfigurieren Feder Sicherheit
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// configure filters
http.addFilterBefore(new LDAPAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class);
http.addFilterBefore(new OTPAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class);
// configure authentication providers
http.authenticationProvider(new LDAPAuthenticationProvider());
http.authenticationProvider(new OTPAuthenticationProvider());
// disable csrf
http.csrf().disable();
// setup security
http.authorizeRequests()
.anyRequest()
.fullyAuthenticated()
.and().httpBasic();
}
}
Hoffnung, das hilft!
Wie funktioniert es funktioniert? Was ist der Kopfzeilenschlüssel "Authorization"? Was sind Authentifizierungen? Danke – tayfun