it-swarm.com.de

Wie kann ich einen zusätzlichen Parameter mit der Spring-Sicherheits-Anmeldeseite übergeben?

Ich versuche, den Datenbanknamen als Anforderungseingabeparameter von der Spring-Sicherheits-Anmeldeseite festzulegen. Zur Zeit bekomme ich nur einen Benutzernamen, der mithilfe der Federsicherheitsfunktion SecurityContextHolder.getContext().getAuthentication() abgerufen wurde.

Wie kann auf das zusätzliche Feld zugegriffen werden, das auf der Anmeldeseite festgelegt wurde?

38
Bhas

Ausarbeitung des Kommentars von @ Vacuum

Hier ist ein einfacher Weg (ungeprüft, aber ich glaube, das würde funktionieren)

1) Erstellen Sie eine neue Klasse ExUsernamePasswordAuthenticationFilter, die den Standardfilter erweitert, den zusätzlichen Parameter übernimmt und ihn in der Sitzung speichert. Es wird ungefähr so ​​aussehen:

    public class ExUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        final String dbValue = request.getParameter("dbParam");
        request.getSession().setAttribute("dbValue", dbValue);

        return super.attemptAuthentication(request, response); 
    } 
}

2) Ändern Sie in Ihrer UserDetailsService-Implementierung Ihre Implementierung von:

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException;

um die Sitzungsvariable zu übernehmen, die der Filter aus Schritt 1) ​​zur Verfügung stellt. 

3) In Ihrer <http />-Sicherheitseinstellung überschreiben Sie den Standardfilter mit Ihrem benutzerdefinierten

<custom-filter ref="beanForYourCustomFilterFromStep1" position="FORM_LOGIN_FILTER"/>

In diesem Teil der Dokumentation finden Sie weitere Informationen zu benutzerdefinierten Filtern: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-custom- Filter

25
user1322340

Es gibt eine Reihe von Möglichkeiten, dies zu tun, aber die offizielle Vorgehensweise ist die Verwendung einer benutzerdefinierten Variablen AuthenticationDetails und AuthenticationDetailsSource, wobei Spring's WebAuthenticationDetails bzw. WebAuthenticationDetailsSource der Unterklasse zugeordnet wird. Fügen Sie der benutzerdefinierten WebAuthenticationDetails das zusätzliche Feld hinzu, und lassen Sie die benutzerdefinierte WebAuthenticationDetailsSource die Daten aus der Anforderung abrufen, um das Feld auszufüllen. 

In Spring Security 3.1 ist es einfach, das authentication-details-source-ref-Attribut des <form-login>-Elements zu konfigurieren.

In 3.0 müssen Sie eine BeanPostProcessor verwenden. Es gibt ein Beispiel in Spring Security FAQ in , das einen BeanPostProcessor zum Konfigurieren einer benutzerdefinierten WebAuthenticationDetailsSource verwendet.

Sobald dies geschehen ist, können Sie SecurityContextHolder.getContext (). GetAuthentication (). GetDetails () aufrufen, um Zugriff auf Ihr zusätzliches Feld zu erhalten.

46
sourcedelica

sourcedelica mit AuthenticationDetailsSource und einer benutzerdefinierten AuthenticationDetails..__ erwähnt. Hier ein Beispiel.

Fügen Sie das authentication-details-source-ref-Attribut mit der Bean-ID customWebAuthenticationDetailsSource zu form-login hinzu:

<security:http>
    <security:intercept-url pattern="/**" access="..." />
    <security:form-login authentication-details-source-ref="customWebAuthenticationDetailsSource" login-page="..." />
    <security:logout logout-success-url="..." />
</security:http>

Erstellen Sie eine neue Klasse CustomWebAuthenticationDetailsSource:

package security;

import org.springframework.security.authentication.AuthenticationDetailsSource;
import org.springframework.security.web.authentication.WebAuthenticationDetails;

import javax.servlet.http.HttpServletRequest;

public class CustomWebAuthenticationDetailsSource implements AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> {
    @Override
    public WebAuthenticationDetails buildDetails(HttpServletRequest context) {
        return new CustomWebAuthenticationDetails(context);
    }
}

und die verwandte CustomWebAuthenticationDetails:

package security;

import org.springframework.security.web.authentication.WebAuthenticationDetails;
import javax.servlet.http.HttpServletRequest;

public class CustomWebAuthenticationDetails extends WebAuthenticationDetails {

    private final String yourParameter;

    public CustomWebAuthenticationDetails(HttpServletRequest request) {
        super(request);
        yourParameter = request.getParameter("yourParameter");
    }

    public String getyourParameter() {
        return yourParameter;
    }

    //TODO override hashCode, equals and toString to include yourParameter
    @Override
    public int hashCode() { /* collapsed */ }
    @Override
    public boolean equals(Object obj) { /* collapsed */ }
    @Override
    public String toString() { /* collapsed */ }
}
22
Kamill Sokol

@ user1322340 bietet keine Implementierungsdetails zum Abrufen von Sitzungsattributen in der Funktion loadUserByUsername:

Schritt 1: Befolgen Sie alle von @ user1322340 bereitgestellten Schritte

Schritt 2: Sie müssen eine Konfiguration in web.xml hinzufügen:

<listener>
    <listener-class>
       org.springframework.web.context.request.RequestContextListener
    </listener-class>
</listener>

Schritt 3: Verwenden Sie diesen Code, um Attribute zu erhalten:

RequestContextHolder.getRequestAttributes().getAttribute("yourAttributeName", RequestAttributes.SCOPE_SESSION);

Schritt 4: Registrieren Sie Ihren Filter in der Frühlingssicherheitskonfiguration. Wenn Sie einen Fehler erhalten, muss " authenticationManager " angegeben werden. Nachdem Sie Ihren Filter in der Konfiguration registriert haben. Sie müssen einen authenticationManagerBean für Ihren erweiterten Filter festlegen und auf diese Weise konfigurieren:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public ExUsernamePasswordAuthenticationFilter exUsernamePasswordAuthenticationFilter()
            throws Exception {
        ExUsernamePasswordAuthenticationFilter exUsernamePasswordAuthenticationFilter = new ExUsernamePasswordAuthenticationFilter();
        exUsernamePasswordAuthenticationFilter
                .setAuthenticationManager(authenticationManagerBean());
        return exUsernamePasswordAuthenticationFilter;
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        RequestMatcher requestMatcher = new RequestMatcher() {
            @Override
            public boolean matches(HttpServletRequest httpServletRequest) {
                if (httpServletRequest.getRequestURI().indexOf("/api", 0) >= 0) {
                    return true;
                }
                return false;
            }
        };

        http
                .addFilterBefore(exUsernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
                ...
    }
}
3
Nicholas Lu

Es gibt einen einfacheren Weg, wenn Sie benutzerdefinierte AuthenticationProvider verwenden. Sie können einfach HttpServletRequest einfügen und Ihre zusätzlichen Parameter abrufen:

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Autowired(required = false)
    private HttpServletRequest request;

    @Autowired
    private MyAccountService myAccountService;

    @Override
    public Authentication authenticate(Authentication authentication) {

        System.out.println("request testing= " + request.getParameter("testing"));

        .....
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}
2
GMsoF

Für die Frühlingssicherheit 3.0 oder höher, die Java-Konfiguration verwendet, funktionieren die folgenden einfachen Schritte gut. 

  • Fügen Sie vor dem UserNameandPasswordAuthenticationFilter im HttpSecurity-Objekt in configure einen Ihrer of-Filter hinzu.

    http.addFilterBefore(new YourFilter(), UsernamePasswordAuthenticationFilter.class);
    
  • Lassen Sie den Filter eine Zeile wie diese haben, um die erforderlichen Felder in Ihrer -Anforderung an die Sitzung zu übergeben.

    if(requestPath != null &&requestPath.equals("/login") ) {
            session.setAttribute("yourParam",req.getParameter("yourParam"));
        }
    
  • Später erhalten Sie den Parameterwert aus der Sitzung in einer beliebigen Klasse als:

    String yourParam =(String)request.getSession().getAttribute("yourParam");
    
1
user6625940

Einfacher Weg: 

1) Registrieren Sie den RequestContextListener

@Bean
public RequestContextListener requestContextListener(){
    return new RequestContextListener();
}

2) Und zur Hauptklasse:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.
currentRequestAttributes()).
getRequest();

3) Danach können wir Params in benutzerdefinierten Headern verwenden:

request.getHeader("OrganizationId")

Einfachste Möglichkeit in nur 2 Schritten:

Schritt 1.

Fügen Sie in web.xml den folgenden Listener hinzu:

<listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value></param-value>
</context-param>

Schritt 2.

Fügen Sie der Klassenmethode Folgendes hinzu, wo Sie zusätzliche Parameter erhalten möchten:

RequestAttributes attribs = RequestContextHolder.getRequestAttributes();

if (RequestContextHolder.getRequestAttributes() != null) {
    HttpServletRequest request = ((ServletRequestAttributes) attribs).getRequest();
}

Jetzt können Sie Ihren zusätzlichen Parameter folgendermaßen erhalten, vorausgesetzt der zusätzliche Parameter heißt "loginType":

request.getParameter("loginType") 
0