Heim > Java > Spring Security ruft Benutzerinformationen für authentifizierte und nicht authentifizierte Benutzer in den verbleibenden Diensten ab

Spring Security ruft Benutzerinformationen für authentifizierte und nicht authentifizierte Benutzer in den verbleibenden Diensten ab

王林
Freigeben: 2024-02-08 23:00:23
nach vorne
778 Leute haben es durchsucht

Sicherheit ist ein wichtiger Aspekt bei der Entwicklung von Webanwendungen. Um Benutzerdaten zu schützen und unbefugten Zugriff zu verhindern, müssen wir einen zuverlässigen Authentifizierungs- und Autorisierungsmechanismus verwenden. Spring Security ist ein leistungsstarkes und weit verbreitetes Sicherheitsframework, das umfassende Lösungen zum Schutz unserer Anwendungen bietet. In diesem Artikel erfahren Sie, wie Sie in Spring Security Benutzerinformationen für authentifizierte und nicht authentifizierte Benutzer erhalten. Der PHP-Editor Baicao zeigt Ihnen, wie Sie die Funktionen von Spring Security nutzen, um Benutzerinformationen abzurufen und Benutzerinformationen zwischen verschiedenen Diensten auszutauschen. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, bietet Ihnen dieser Artikel detaillierte Informationen zu Spring Security und hilft Ihnen, die Sicherheit Ihrer Anwendung zu verbessern.

Frageninhalt

Ich habe einen Frühlingsruhedienst und möchte ihn sowohl für authentifizierte als auch für nicht authentifizierte Benutzer nutzen. Wenn der Benutzer authentifiziert ist, möchte ich die Benutzerinformationen von securitycontextholder.getcontext().getauthentication() erhalten.

  • Wenn ich benutze .antmatchers("/app/rest/question/useroperation/list/**").permitall() In der unten gezeigten ouath2-Konfiguration kann ich dann die Benutzerinformationen abrufen Authentifizierte Benutzer, nicht authentifizierte Benutzer erhalten jedoch einen 401-Fehler.
  • Wenn ich .antmatchers("/app/rest/question/useroperation/list/**").permitall() und ignorieren Sie die URL in der Websicherheit web.ignoring()..antmatchers("/app/rest/question/useroperation/list/**") In securityconfiguration wie unten können dann alle Benutzer anrufen Dienst, aber ich kann die Benutzerinformationen nicht aus dem Sicherheitskontext abrufen.

Wie konfiguriere ich meine Spring-Sicherheit so, dass sie die URL für authentifizierte und nicht authentifizierte Benutzer aufruft und die Benutzerinformationen aus dem Sicherheitskontext erhält, wenn sich der Benutzer anmeldet?

@configuration
@enableresourceserver
protected static class resourceserverconfiguration extends resourceserverconfigureradapter {

    @inject
    private http401unauthorizedentrypoint authenticationentrypoint;

    @inject
    private ajaxlogoutsuccesshandler ajaxlogoutsuccesshandler;

    @override
    public void configure(httpsecurity http) throws exception {
        http
                .exceptionhandling()
                .authenticationentrypoint(authenticationentrypoint)
                .and()
                .logout()
                .logouturl("/app/logout")
                .logoutsuccesshandler(ajaxlogoutsuccesshandler)
                .and()
                .csrf()
                .requirecsrfprotectionmatcher(new antpathrequestmatcher("/oauth/authorize"))
                .disable()
                .headers()
                .frameoptions().disable()
                .sessionmanagement()
                .sessioncreationpolicy(sessioncreationpolicy.stateless)
                .and()
                .authorizerequests()
                .antmatchers("/views/**").permitall()
                .antmatchers("/app/rest/authenticate").permitall()
                .antmatchers("/app/rest/register").permitall()
                .antmatchers("/app/rest/question/useroperation/list/**").permitall()
                .antmatchers("/app/rest/question/useroperation/comment/**").authenticated()
                .antmatchers("/app/rest/question/useroperation/answer/**").authenticated()
                .antmatchers("/app/rest/question/definition/**").hasanyauthority(authoritiesconstants.admin)
                .antmatchers("/app/rest/logs/**").hasanyauthority(authoritiesconstants.admin)
                .antmatchers("/app/**").authenticated()
                .antmatchers("/websocket/tracker").hasauthority(authoritiesconstants.admin)
                .antmatchers("/websocket/**").permitall()
                .antmatchers("/metrics/**").hasauthority(authoritiesconstants.admin)
                .antmatchers("/health/**").hasauthority(authoritiesconstants.admin)
                .antmatchers("/trace/**").hasauthority(authoritiesconstants.admin)
                .antmatchers("/dump/**").hasauthority(authoritiesconstants.admin)
                .antmatchers("/shutdown/**").hasauthority(authoritiesconstants.admin)
                .antmatchers("/beans/**").hasauthority(authoritiesconstants.admin)
                .antmatchers("/info/**").hasauthority(authoritiesconstants.admin)
                .antmatchers("/autoconfig/**").hasauthority(authoritiesconstants.admin)
                .antmatchers("/env/**").hasauthority(authoritiesconstants.admin)
                .antmatchers("/trace/**").hasauthority(authoritiesconstants.admin)
                .antmatchers("/api-docs/**").hasauthority(authoritiesconstants.admin)
                .antmatchers("/protected/**").authenticated();

    }

}
Nach dem Login kopieren

Sicherheitskonfiguration

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Inject
    private UserDetailsService userDetailsService;


    @Bean
    public PasswordEncoder passwordEncoder() {
        return new StandardPasswordEncoder();
    }

    @Inject
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .userDetailsService(userDetailsService)
                .passwordEncoder(passwordEncoder());
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring()
            .antMatchers("/bower_components/**")
            .antMatchers("/fonts/**")
            .antMatchers("/images/**")
            .antMatchers("/scripts/**")
            .antMatchers("/styles/**")
            .antMatchers("/views/**")
            .antMatchers("/i18n/**")
            .antMatchers("/swagger-ui/**")
            .antMatchers("/app/rest/register")
            .antMatchers("/app/rest/activate")
            .antMatchers("/app/rest/question/useroperation/list/**")
            .antMatchers("/console/**");
    }


    @EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true)
    private static class GlobalSecurityConfiguration extends GlobalMethodSecurityConfiguration {
        @Override
        protected MethodSecurityExpressionHandler createExpressionHandler() {
            return new OAuth2MethodSecurityExpressionHandler();
        }

    }
}
Nach dem Login kopieren

Lösung

permitall() 仍然需要 authentication 对象出现在 securitycontext in.

Für nicht-authentifizierte Benutzer kann dies erreicht werden, indem der anonyme Zugriff aktiviert wird:

@override
public void configure(httpsecurity http) throws exception {
   http
//some configuration
     .and()
        .anonymous() //allow anonymous access
     .and()
        .authorizerequests()
           .antmatchers("/views/**").permitall()
//other security settings
Nach dem Login kopieren

Anonymer Zugriff fügt zusätzlichen Filter hinzu: anonymousauthenticationfilter到填充anonymousauthenticationtoken作为身份验证信息的过滤器链,以防securitycontext中没有authentication Objekt

Ich habe diese Sicherheitskonfiguration zur Überprüfung des Autors über /public/authphpcnendcphp Chinesisch:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().and().authorizeRequests()
           .antMatchers("/api/skills/**", "/api/profile/**", "/api/info/**").authenticated()
           .antMatchers("/api/**").hasAuthority(Role.ROLE_ADMIN.getAuthority())
           .antMatchers("/public/auth").permitAll()
           .and().httpBasic()
           .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
           .and().csrf().disable();
}

@GetMapping(value = "/public/auth")
private ResponseEntity<User> getAuthUser(@AuthenticationPrincipal AuthUser authUser) {
    return authUser == null ? 
               ResponseEntity.notFound().build() :
               ResponseEntity.ok(authUser.getUser());
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSpring Security ruft Benutzerinformationen für authentifizierte und nicht authentifizierte Benutzer in den verbleibenden Diensten ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage