Rumah >Java >Spring Security mendapat maklumat pengguna untuk pengguna yang disahkan dan tidak disahkan dalam perkhidmatan yang tinggal

Spring Security mendapat maklumat pengguna untuk pengguna yang disahkan dan tidak disahkan dalam perkhidmatan yang tinggal

王林
王林ke hadapan
2024-02-08 23:00:23758semak imbas

Keselamatan adalah pertimbangan penting semasa membangunkan aplikasi web. Untuk melindungi data pengguna dan menghalang capaian yang tidak dibenarkan, kami perlu menggunakan mekanisme pengesahan dan kebenaran yang boleh dipercayai. Spring Security ialah rangka kerja keselamatan yang berkuasa dan digunakan secara meluas yang menyediakan set lengkap penyelesaian untuk melindungi aplikasi kami. Dalam artikel ini, kami akan meneroka cara mendapatkan maklumat pengguna untuk pengguna yang disahkan dan tidak disahkan dalam Spring Security. Editor PHP Baicao akan menunjukkan kepada anda cara menggunakan ciri Spring Security untuk mendapatkan maklumat pengguna dan berkongsi maklumat pengguna antara perkhidmatan yang berbeza. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini akan memberikan anda maklumat terperinci tentang Spring Security dan membantu anda meningkatkan keselamatan aplikasi anda.

Kandungan soalan

Saya mempunyai perkhidmatan rehat musim bunga dan saya ingin menggunakannya untuk pengguna yang sah dan tidak sah. Jika pengguna disahkan, saya ingin mendapatkan maklumat pengguna daripada securitycontextholder.getcontext().getauthentication().

  • Kalau saya guna .antmatchers("/app/rest/question/useroperation/list/**").permitall() Dalam konfigurasi ouath2 seperti yang ditunjukkan di bawah, maka saya boleh mendapatkan maklumat pengguna Pengguna yang disahkan, tetapi pengguna yang tidak disahkan mendapat ralat 401.
  • Jika saya .antmatchers("/app/rest/question/useroperation/list/**").permitall() dan abaikan url dalam websecurity web.ignoring()..antmatchers("/app/rest/question/useroperation/list/**") Dalam securityconfiguration seperti di bawah, barulah semua pengguna boleh menghubungi perkhidmatan tetapi saya tidak boleh mendapatkan maklumat pengguna daripada konteks keselamatan.

Bagaimana cara saya mengkonfigurasi keselamatan musim bunga saya untuk memanggil url untuk pengguna yang disahkan dan tidak disahkan dan mendapatkan maklumat pengguna daripada konteks keselamatan apabila pengguna log masuk.

@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();

    }

}

Konfigurasi keselamatan

@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();
        }

    }
}

Penyelesaian

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

Untuk pengguna bukan oauth, ini boleh dicapai dengan mendayakan akses tanpa nama:

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

Akses tanpa nama akan menambah penapis tambahan: anonymousauthenticationfilter到填充anonymousauthenticationtoken作为身份验证信息的过滤器链,以防securitycontext中没有authentication objek

Saya mempunyai konfigurasi keselamatan ini untuk menyemak authuser melalui /public/authphpcnendcphp Cina:

@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());
}

Atas ialah kandungan terperinci Spring Security mendapat maklumat pengguna untuk pengguna yang disahkan dan tidak disahkan dalam perkhidmatan yang tinggal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam